THRIFT-1973 TCompactProtocol in C# lib does not serialize and deserialize negative int32 and int64 number correctly
Patch: Eric Ding
diff --git a/lib/csharp/Makefile.am b/lib/csharp/Makefile.am
index ee71bc9..7bc161d 100644
--- a/lib/csharp/Makefile.am
+++ b/lib/csharp/Makefile.am
@@ -61,16 +61,7 @@
             src/TProcessor.cs \
             src/TApplicationException.cs
 
-THRIFTTESTCODE = \
-	    test/ThriftTest/Program.cs \
-	    test/ThriftTest/TestClient.cs \
-	    test/ThriftTest/TestServer.cs \
-	    test/ThriftTest/RoundTripTest.cs \
-	    test/ThriftTest/Thrift/Test/*.cs
-
 CSC=gmcs
-NUNIT=nunit-console
-THRIFT=../../compiler/cpp/thrift
 
 if NET_2_0
 MONO_DEFINES=/d:NET_2_0
@@ -81,15 +72,6 @@
 Thrift.dll: $(THRIFTCODE)
 	$(CSC) $(THRIFTCODE) /out:Thrift.dll /target:library /reference:System.Web $(MONO_DEFINES)
 
-test/ThriftTest/Thrift/Test/*.cs: ../../test/ThriftTest.thrift
-	$(THRIFT) -gen csharp:hashcode -out test/ThriftTest ../../test/ThriftTest.thrift
-
-ThriftTest.exe: Thrift.dll $(THRIFTTESTCODE)
-	$(CSC) $(THRIFTTESTCODE) /out:ThriftTest.exe /target:exe /reference:nunit.framework /reference:Thrift.dll $(MONO_DEFINES)
-
-check-local: ThriftTest.exe
-	$(NUNIT) ThriftTest.exe
-
 clean-local:
 	$(RM) Thrift.dll
 
diff --git a/lib/csharp/src/Thrift.sln b/lib/csharp/src/Thrift.sln
index 5c210a5..ee0a3e7 100644
--- a/lib/csharp/src/Thrift.sln
+++ b/lib/csharp/src/Thrift.sln
@@ -1,35 +1,38 @@
-

-Microsoft Visual Studio Solution File, Format Version 11.00

-# Visual Studio 2010

-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thrift", "Thrift.csproj", "{499EB63C-D74C-47E8-AE48-A2FC94538E9D}"

-EndProject

-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThriftMSBuildTask", "..\ThriftMSBuildTask\ThriftMSBuildTask.csproj", "{EC0A0231-66EA-4593-A792-C6CA3BB8668E}"

-EndProject

-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThriftTest", "..\test\ThriftTest\ThriftTest.csproj", "{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}"

-EndProject

-Global

-	GlobalSection(SolutionConfigurationPlatforms) = preSolution

-		Debug|Any CPU = Debug|Any CPU

-		Release|Any CPU = Release|Any CPU

-	EndGlobalSection

-	GlobalSection(ProjectConfigurationPlatforms) = postSolution

-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Debug|Any CPU.Build.0 = Debug|Any CPU

-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Release|Any CPU.ActiveCfg = Release|Any CPU

-		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Release|Any CPU.Build.0 = Release|Any CPU

-		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Debug|Any CPU.Build.0 = Debug|Any CPU

-		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Release|Any CPU.ActiveCfg = Release|Any CPU

-		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Release|Any CPU.Build.0 = Release|Any CPU

-		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

-		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Debug|Any CPU.Build.0 = Debug|Any CPU

-		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Release|Any CPU.ActiveCfg = Release|Any CPU

-		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Release|Any CPU.Build.0 = Release|Any CPU

-	EndGlobalSection

-	GlobalSection(MonoDevelopProperties) = preSolution

-		StartupItem = Thrift.csproj

-	EndGlobalSection

-	GlobalSection(SolutionProperties) = preSolution

-		HideSolutionNode = FALSE

-	EndGlobalSection

-EndGlobal

+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Thrift", "Thrift.csproj", "{499EB63C-D74C-47E8-AE48-A2FC94538E9D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThriftTest", "..\test\ThriftTest\ThriftTest.csproj", "{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}"
+	ProjectSection(ProjectDependencies) = postProject
+		{499EB63C-D74C-47E8-AE48-A2FC94538E9D} = {499EB63C-D74C-47E8-AE48-A2FC94538E9D}
+	EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ThriftMSBuildTask", "..\ThriftMSBuildTask\ThriftMSBuildTask.csproj", "{EC0A0231-66EA-4593-A792-C6CA3BB8668E}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{499EB63C-D74C-47E8-AE48-A2FC94538E9D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{48DD757F-CA95-4DD7-BDA4-58DB6F108C2C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{EC0A0231-66EA-4593-A792-C6CA3BB8668E}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(MonoDevelopProperties) = preSolution
+		StartupItem = Thrift.csproj
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal
diff --git a/lib/csharp/src/Transport/TMemoryBuffer.cs b/lib/csharp/src/Transport/TMemoryBuffer.cs
index b2e67db..c6e72f1 100644
--- a/lib/csharp/src/Transport/TMemoryBuffer.cs
+++ b/lib/csharp/src/Transport/TMemoryBuffer.cs
@@ -23,6 +23,7 @@
 
 namespace Thrift.Transport {
 	public class TMemoryBuffer : TTransport {
+
 		private readonly MemoryStream byteStream;
 
 		public TMemoryBuffer() {
@@ -59,12 +60,8 @@
 		}
 
 		public static byte[] Serialize(TBase s) {
-			return Serialize(s, new TBinaryProtocol.Factory());
-		}
-
-		public static byte[] Serialize(TBase s, TProtocolFactory factory) {
 			var t = new TMemoryBuffer();
-			var p = factory.GetProtocol(t);
+			var p = new TBinaryProtocol(t);
 
 			s.Write(p);
 
@@ -72,13 +69,9 @@
 		}
 
 		public static T DeSerialize<T>(byte[] buf) where T : TBase, new() {
-			return DeSerialize<T>(buf, new TBinaryProtocol.Factory());
-		}
-
-		public static T DeSerialize<T>(byte[] buf, TProtocolFactory factory) where T : TBase, new() {
 		       var t = new T();
 		       var trans = new TMemoryBuffer(buf);
-		       var p = factory.GetProtocol(trans);
+		       var p = new TBinaryProtocol(trans);
 		       t.Read(p);
 		       return t;
 		}
diff --git a/lib/csharp/test/ThriftTest/ThriftTest.csproj b/lib/csharp/test/ThriftTest/ThriftTest.csproj
index 0187eed..8717876 100644
--- a/lib/csharp/test/ThriftTest/ThriftTest.csproj
+++ b/lib/csharp/test/ThriftTest/ThriftTest.csproj
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>

+<?xml version="1.0" encoding="utf-8"?>

 <!--

   Licensed to the Apache Software Foundation (ASF) under one

   or more contributor license agreements. See the NOTICE file

@@ -71,20 +71,16 @@
   </PropertyGroup>

   <ItemGroup>

     <Reference Include="System" />

-    <Reference Include="ThriftImpl">

-      <HintPath>ThriftImpl.dll</HintPath>

-    </Reference>

-    <Reference Include="nunit.framework, Version=2.6.0.12051, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77">

-      <Private>False</Private>

+    <Reference Include="ThriftImpl, Version=0.0.0.0, Culture=neutral, processorArchitecture=MSIL">

+      <SpecificVersion>False</SpecificVersion>

+      <HintPath>.\ThriftImpl.dll</HintPath>

     </Reference>

   </ItemGroup>

   <ItemGroup>

-    <Compile Include="gen-csharp\Thrift\Test\*.cs" />

     <Compile Include="Program.cs" />

     <Compile Include="Properties\AssemblyInfo.cs" />

     <Compile Include="TestClient.cs" />

     <Compile Include="TestServer.cs" />

-    <Compile Include="RoundTripTest.cs" />

   </ItemGroup>

   <ItemGroup>

     <BootstrapperPackage Include="Microsoft.Net.Client.3.5">

@@ -142,4 +138,4 @@
 "$(ProjectDir)\..\..\..\..\compiler\cpp\thrift.exe" --gen csharp -o %25SHORT_DIR%25 %25THRIFT_SHORT%25

 $(MSBuildToolsPath)\Csc.exe /t:library /out:"$(ProjectDir)ThriftImpl.dll" /recurse:"$(ProjectDir)gen-csharp"\* /reference:"$(ProjectDir)..\..\src\bin\Debug\Thrift.dll"</PreBuildEvent>

   </PropertyGroup>

-</Project>

+</Project>
\ No newline at end of file
diff --git a/lib/csharp/test/ThriftTest/maketest.sh b/lib/csharp/test/ThriftTest/maketest.sh
new file mode 100644
index 0000000..86c1a11
--- /dev/null
+++ b/lib/csharp/test/ThriftTest/maketest.sh
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+../../../../compiler/cpp/thrift --gen csharp -o . ../../../../test/ThriftTest.thrift
+gmcs /t:library /out:./ThriftImpl.dll /recurse:./gen-csharp/* /reference:../../Thrift.dll
+gmcs  /out:TestClientServer.exe /reference:../../Thrift.dll /reference:ThriftImpl.dll TestClient.cs TestServer.cs Program.cs
+
+export MONO_PATH=../../
+
+timeout 120 ./TestClientServer.exe server &
+./TestClientServer.exe client
diff --git a/test/ThriftTest.thrift b/test/ThriftTest.thrift
index d191afd..be000b6 100644
--- a/test/ThriftTest.thrift
+++ b/test/ThriftTest.thrift
@@ -375,11 +375,3 @@
   1: optional StructA aa;
   2: required StructA ab;
 }
-
-struct Primitives {
-  1: optional byte byte_thing;
-  2: optional i16 i16_thing;
-  3: optional i32 i32_thing;
-  4: optional i64 i64_thing;
-  5: optional bool bool_thing;
-}