Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/DBTests.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/DBTests.cs	(revision 5298)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/DBTests.cs	(revision 5298)
@@ -0,0 +1,466 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Data.Linq;
+using System.Linq;
+using HeuristicLab.Services.OKB.DataAccess;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace HeuristicLab.Services.OKB.DataAccess_33.Tests {
+  /// <summary>
+  /// Summary description for DBTests
+  /// </summary>
+  [TestClass]
+  public class DBTests {
+    private const int PLATFORMS = 1;
+    private const int DATATYPES_PER_PLATFORM = 500;
+    private const int ALGORITHMCLASSES_PER_PLATFORM = 10;
+    private const int ALGORITHMS_PER_CLASS = 10;
+    private const int PROBLEMCLASSES_PER_PLATFORM = 10;
+    private const int PROBLEMS_PER_CLASS = 10;
+    private const int PARAMETERS_PER_ALGORITHM = 10;
+    private const int RESULTS_PER_ALGORITHM = 10;
+    private const int PARAMETERS_PER_PROBLEM = 10;
+    private const int EXPERIMENTS_PER_PLATFORM = 1000;
+    private const int RUNS_PER_EXPERIMENT = 10;
+    private const int ALGORITHMDATA_SIZE = 1024 * 1024;
+    private const int PROBLEMDATA_SIZE = 1024 * 1024;
+    private const int BLOBVALUE_SIZE = 1024;
+
+    private string[] sqlNames = new string[] { "varbinary", "nvarchar", "float", "bit", "bigint" };
+    private Random random = new Random();
+    private DataType[] varbinaryTypes;
+    private DataType[] nvarcharTypes;
+    private DataType[] floatTypes;
+    private DataType[] bitTypes;
+    private DataType[] bigintTypes;
+
+    public DBTests() {
+      //
+      // TODO: Add constructor logic here
+      //
+    }
+
+    private TestContext testContextInstance;
+
+    /// <summary>
+    ///Gets or sets the test context which provides
+    ///information about and functionality for the current test run.
+    ///</summary>
+    public TestContext TestContext {
+      get {
+        return testContextInstance;
+      }
+      set {
+        testContextInstance = value;
+      }
+    }
+
+    #region Additional test attributes
+    //
+    // You can use the following additional attributes as you write your tests:
+    //
+    // Use ClassInitialize to run code before running the first test in the class
+    // [ClassInitialize()]
+    // public static void MyClassInitialize(TestContext testContext) { }
+    //
+    // Use ClassCleanup to run code after all tests in a class have run
+    // [ClassCleanup()]
+    // public static void MyClassCleanup() { }
+    //
+    // Use TestInitialize to run code before running each test 
+    // [TestInitialize()]
+    // public void MyTestInitialize() { }
+    //
+    // Use TestCleanup to run code after each test has run
+    // [TestCleanup()]
+    // public void MyTestCleanup() { }
+    //
+    #endregion
+
+    [TestMethod]
+    public void ClearDB() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        okb.ExecuteCommand("DELETE FROM dbo.ResultBlobValue");
+        okb.ExecuteCommand("DELETE FROM dbo.ResultBoolValue");
+        okb.ExecuteCommand("DELETE FROM dbo.ResultFloatValue");
+        okb.ExecuteCommand("DELETE FROM dbo.ResultIntValue");
+        okb.ExecuteCommand("DELETE FROM dbo.ResultStringValue");
+
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterBlobValue");
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterBoolValue");
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterFloatValue");
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterIntValue");
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterStringValue");
+
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterBlobValue");
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterBoolValue");
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterFloatValue");
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterIntValue");
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterStringValue");
+
+        okb.ExecuteCommand("DELETE FROM dbo.Run");
+        okb.ExecuteCommand("DELETE FROM dbo.Experiment");
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmData");
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmUser");
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameter");
+        okb.ExecuteCommand("DELETE FROM dbo.Result");
+        okb.ExecuteCommand("DELETE FROM dbo.Algorithm");
+        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmClass");
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemData");
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemUser");
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameter");
+        okb.ExecuteCommand("DELETE FROM dbo.Problem");
+        okb.ExecuteCommand("DELETE FROM dbo.ProblemClass");
+        okb.ExecuteCommand("DELETE FROM dbo.DataType");
+        okb.ExecuteCommand("DELETE FROM dbo.Platform");
+      }
+    }
+
+    [TestMethod]
+    public void InitDummyDB() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        for (int i = 0; i < PLATFORMS; i++) {
+          CreatePlatform(okb);
+        }
+        okb.SubmitChanges();
+      }
+    }
+
+    [TestMethod]
+    public void CreateDummyExperiments() {
+      using (OKBDataContext okb = new OKBDataContext()) {
+        foreach (Platform platform in okb.Platforms) {
+          for (int i = 0; i < EXPERIMENTS_PER_PLATFORM; i++) {
+            Algorithm[] algorithms = okb.Algorithms.Where(x => x.PlatformId == platform.Id).ToArray();
+            Problem[] problems = okb.Problems.Where(x => x.PlatformId == platform.Id).ToArray();
+            varbinaryTypes = null;
+            nvarcharTypes = null;
+            floatTypes = null;
+            bitTypes = null;
+            bigintTypes = null;
+
+            CreateExperiment(okb, algorithms[random.Next(algorithms.Length)], problems[random.Next(problems.Length)], platform);
+          }
+          okb.SubmitChanges();
+        }
+      }
+    }
+
+    private void CreatePlatform(OKBDataContext okb) {
+      Platform entity = new Platform();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.Description = Guid.NewGuid().ToString();
+      okb.Platforms.InsertOnSubmit(entity);
+
+      for (int i = 0; i < DATATYPES_PER_PLATFORM; i++) {
+        CreateDataType(okb, entity);
+      }
+      okb.SubmitChanges();
+
+      varbinaryTypes = null;
+      nvarcharTypes = null;
+      floatTypes = null;
+      bitTypes = null;
+      bigintTypes = null;
+
+      for (int i = 0; i < ALGORITHMCLASSES_PER_PLATFORM; i++) {
+        CreateAlgorithmClass(okb, entity);
+      }
+      for (int i = 0; i < PROBLEMCLASSES_PER_PLATFORM; i++) {
+        CreateProblemClass(okb, entity);
+      }
+    }
+    private void CreateDataType(OKBDataContext okb, Platform platform) {
+      DataType entity = new DataType();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.TypeName = Guid.NewGuid().ToString();
+      entity.SqlName = sqlNames[random.Next(sqlNames.Length)];
+      entity.Platform = platform;
+      okb.DataTypes.InsertOnSubmit(entity);
+    }
+    private DataType GetDataType(OKBDataContext okb, Platform platform, string sqlName) {
+      if (varbinaryTypes == null) varbinaryTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "varbinary")).ToArray();
+      if (nvarcharTypes == null) nvarcharTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "nvarchar")).ToArray();
+      if (floatTypes == null) floatTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "float")).ToArray();
+      if (bitTypes == null) bitTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "bit")).ToArray();
+      if (bigintTypes == null) bigintTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "bigint")).ToArray();
+
+      switch (sqlName) {
+        case "varbinary": return varbinaryTypes[random.Next(varbinaryTypes.Length)];
+        case "nvarchar": return nvarcharTypes[random.Next(nvarcharTypes.Length)];
+        case "float": return floatTypes[random.Next(floatTypes.Length)];
+        case "bit": return bitTypes[random.Next(bitTypes.Length)];
+        case "bigint": return bigintTypes[random.Next(bigintTypes.Length)];
+        default: return null;
+      }
+    }
+    private void CreateAlgorithmClass(OKBDataContext okb, Platform platform) {
+      AlgorithmClass entity = new AlgorithmClass();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.Description = Guid.NewGuid().ToString();
+      for (int i = 0; i < ALGORITHMS_PER_CLASS; i++) {
+        CreateAlgorithm(okb, entity, platform);
+      }
+      okb.AlgorithmClasses.InsertOnSubmit(entity);
+    }
+    private void CreateProblemClass(OKBDataContext okb, Platform platform) {
+      ProblemClass entity = new ProblemClass();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.Description = Guid.NewGuid().ToString();
+      for (int i = 0; i < PROBLEMS_PER_CLASS; i++) {
+        CreateProblem(okb, entity, platform);
+      }
+      okb.ProblemClasses.InsertOnSubmit(entity);
+    }
+    private void CreateAlgorithm(OKBDataContext okb, AlgorithmClass algorithmClass, Platform platform) {
+      Algorithm entity = new Algorithm();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.Description = Guid.NewGuid().ToString();
+      entity.AlgorithmClass = algorithmClass;
+      entity.Platform = platform;
+      CreateAlgorithmData(okb, entity, platform);
+      for (int i = 0; i < PARAMETERS_PER_ALGORITHM; i++) {
+        CreateAlgorithmParameter(okb, entity, platform);
+      }
+      for (int i = 0; i < RESULTS_PER_ALGORITHM; i++) {
+        CreateResult(okb, entity, platform);
+      }
+      okb.Algorithms.InsertOnSubmit(entity);
+    }
+    private void CreateAlgorithmData(OKBDataContext okb, Algorithm algorithm, Platform platform) {
+      AlgorithmData entity = new AlgorithmData();
+      entity.Algorithm = algorithm;
+      entity.Data = new System.Data.Linq.Binary(new byte[ALGORITHMDATA_SIZE]);
+      entity.DataType = GetDataType(okb, platform, "varbinary");
+      okb.AlgorithmDatas.InsertOnSubmit(entity);
+    }
+    private void CreateAlgorithmParameter(OKBDataContext okb, Algorithm algorithm, Platform platform) {
+      AlgorithmParameter entity = new AlgorithmParameter();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.Alias = Guid.NewGuid().ToString();
+      entity.Description = Guid.NewGuid().ToString();
+      entity.Algorithm = algorithm;
+      entity.DataType = GetDataType(okb, platform, sqlNames[random.Next(sqlNames.Length)]);
+      okb.AlgorithmParameters.InsertOnSubmit(entity);
+    }
+    private void CreateResult(OKBDataContext okb, Algorithm algorithm, Platform platform) {
+      Result entity = new Result();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.Alias = Guid.NewGuid().ToString();
+      entity.Description = Guid.NewGuid().ToString();
+      entity.Algorithm = algorithm;
+      entity.DataType = GetDataType(okb, platform, sqlNames[random.Next(sqlNames.Length)]);
+      okb.Results.InsertOnSubmit(entity);
+    }
+    private void CreateProblem(OKBDataContext okb, ProblemClass problemClass, Platform platform) {
+      Problem entity = new Problem();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.Description = Guid.NewGuid().ToString();
+      entity.ProblemClass = problemClass;
+      entity.Platform = platform;
+      CreateProblemData(okb, entity, platform);
+      for (int i = 0; i < PARAMETERS_PER_PROBLEM; i++) {
+        CreateProblemParameter(okb, entity, platform);
+      }
+      okb.Problems.InsertOnSubmit(entity);
+    }
+    private void CreateProblemData(OKBDataContext okb, Problem problem, Platform platform) {
+      ProblemData entity = new ProblemData();
+      entity.Problem = problem;
+      entity.Data = new System.Data.Linq.Binary(new byte[PROBLEMDATA_SIZE]);
+      entity.DataType = GetDataType(okb, platform, "varbinary");
+      okb.ProblemDatas.InsertOnSubmit(entity);
+    }
+    private void CreateProblemParameter(OKBDataContext okb, Problem problem, Platform platform) {
+      ProblemParameter entity = new ProblemParameter();
+      entity.Name = Guid.NewGuid().ToString();
+      entity.Alias = Guid.NewGuid().ToString();
+      entity.Description = Guid.NewGuid().ToString();
+      entity.Problem = problem;
+      entity.DataType = GetDataType(okb, platform, sqlNames[random.Next(sqlNames.Length)]);
+      okb.ProblemParameters.InsertOnSubmit(entity);
+    }
+    private void CreateExperiment(OKBDataContext okb, Algorithm algorithm, Problem problem, Platform platform) {
+      Experiment entity = new Experiment();
+      entity.Algorithm = algorithm;
+      entity.Problem = problem;
+
+      foreach (AlgorithmParameter algorithmParameter in okb.AlgorithmParameters.Where(x => x.AlgorithmId == algorithm.Id)) {
+        CreateAlgorithmParameterValue(okb, algorithmParameter, entity, platform);
+      }
+      foreach (ProblemParameter problemParameter in okb.ProblemParameters.Where(x => x.ProblemId == problem.Id)) {
+        CreateProblemParameterValue(okb, problemParameter, entity, platform);
+      }
+
+      for (int i = 0; i < RUNS_PER_EXPERIMENT; i++) {
+        CreateRun(okb, entity, platform);
+      }
+      okb.Experiments.InsertOnSubmit(entity);
+    }
+    private void CreateAlgorithmParameterValue(OKBDataContext okb, AlgorithmParameter algorithmParameter, Experiment experiment, Platform platform) {
+      switch (algorithmParameter.DataType.SqlName) {
+        case "varbinary":
+          AlgorithmParameterBlobValue v1 = new AlgorithmParameterBlobValue();
+          v1.AlgorithmParameter = algorithmParameter;
+          v1.Experiment = experiment;
+          v1.Value = new Binary(new byte[BLOBVALUE_SIZE]);
+          v1.DataType = GetDataType(okb, platform, "varbinary");
+          okb.AlgorithmParameterBlobValues.InsertOnSubmit(v1);
+          return;
+        case "bit":
+          AlgorithmParameterBoolValue v2 = new AlgorithmParameterBoolValue();
+          v2.AlgorithmParameter = algorithmParameter;
+          v2.Experiment = experiment;
+          v2.Value = random.Next(2) == 0;
+          v2.DataType = GetDataType(okb, platform, "bit");
+          okb.AlgorithmParameterBoolValues.InsertOnSubmit(v2);
+          return;
+        case "float":
+          AlgorithmParameterFloatValue v3 = new AlgorithmParameterFloatValue();
+          v3.AlgorithmParameter = algorithmParameter;
+          v3.Experiment = experiment;
+          v3.Value = random.NextDouble();
+          v3.DataType = GetDataType(okb, platform, "float");
+          okb.AlgorithmParameterFloatValues.InsertOnSubmit(v3);
+          return;
+        case "bigint":
+          AlgorithmParameterIntValue v4 = new AlgorithmParameterIntValue();
+          v4.AlgorithmParameter = algorithmParameter;
+          v4.Experiment = experiment;
+          v4.Value = random.Next();
+          v4.DataType = GetDataType(okb, platform, "bigint");
+          okb.AlgorithmParameterIntValues.InsertOnSubmit(v4);
+          return;
+        case "nvarchar":
+          AlgorithmParameterStringValue v5 = new AlgorithmParameterStringValue();
+          v5.AlgorithmParameter = algorithmParameter;
+          v5.Experiment = experiment;
+          v5.Value = Guid.NewGuid().ToString();
+          v5.DataType = GetDataType(okb, platform, "nvarchar");
+          okb.AlgorithmParameterStringValues.InsertOnSubmit(v5);
+          return;
+      }
+    }
+    private void CreateProblemParameterValue(OKBDataContext okb, ProblemParameter problemParameter, Experiment experiment, Platform platform) {
+      switch (problemParameter.DataType.SqlName) {
+        case "varbinary":
+          ProblemParameterBlobValue v1 = new ProblemParameterBlobValue();
+          v1.ProblemParameter = problemParameter;
+          v1.Experiment = experiment;
+          v1.Value = new Binary(new byte[BLOBVALUE_SIZE]);
+          v1.DataType = GetDataType(okb, platform, "varbinary");
+          okb.ProblemParameterBlobValues.InsertOnSubmit(v1);
+          return;
+        case "bit":
+          ProblemParameterBoolValue v2 = new ProblemParameterBoolValue();
+          v2.ProblemParameter = problemParameter;
+          v2.Experiment = experiment;
+          v2.Value = random.Next(2) == 0;
+          v2.DataType = GetDataType(okb, platform, "bit");
+          okb.ProblemParameterBoolValues.InsertOnSubmit(v2);
+          return;
+        case "float":
+          ProblemParameterFloatValue v3 = new ProblemParameterFloatValue();
+          v3.ProblemParameter = problemParameter;
+          v3.Experiment = experiment;
+          v3.Value = random.NextDouble();
+          v3.DataType = GetDataType(okb, platform, "float");
+          okb.ProblemParameterFloatValues.InsertOnSubmit(v3);
+          return;
+        case "bigint":
+          ProblemParameterIntValue v4 = new ProblemParameterIntValue();
+          v4.ProblemParameter = problemParameter;
+          v4.Experiment = experiment;
+          v4.Value = random.Next();
+          v4.DataType = GetDataType(okb, platform, "bigint");
+          okb.ProblemParameterIntValues.InsertOnSubmit(v4);
+          return;
+        case "nvarchar":
+          ProblemParameterStringValue v5 = new ProblemParameterStringValue();
+          v5.ProblemParameter = problemParameter;
+          v5.Experiment = experiment;
+          v5.Value = Guid.NewGuid().ToString();
+          v5.DataType = GetDataType(okb, platform, "nvarchar");
+          okb.ProblemParameterStringValues.InsertOnSubmit(v5);
+          return;
+      }
+    }
+    private void CreateRun(OKBDataContext okb, Experiment experiment, Platform platform) {
+      Run entity = new Run();
+      entity.RandomSeed = random.Next();
+      entity.CreatedDate = DateTime.Now;
+      entity.UserId = Guid.NewGuid();
+      entity.ClientId = Guid.NewGuid();
+      entity.Experiment = experiment;
+
+      foreach (Result result in okb.Results.Where(x => x.AlgorithmId == experiment.AlgorithmId)) {
+        CreateResultValue(okb, result, entity, platform);
+      }
+      okb.Runs.InsertOnSubmit(entity);
+    }
+    private void CreateResultValue(OKBDataContext okb, Result result, Run run, Platform platform) {
+      switch (result.DataType.SqlName) {
+        case "varbinary":
+          ResultBlobValue v1 = new ResultBlobValue();
+          v1.Result = result;
+          v1.Run = run;
+          v1.Value = new Binary(new byte[BLOBVALUE_SIZE]);
+          v1.DataType = GetDataType(okb, platform, "varbinary");
+          okb.ResultBlobValues.InsertOnSubmit(v1);
+          return;
+        case "bit":
+          ResultBoolValue v2 = new ResultBoolValue();
+          v2.Result = result;
+          v2.Run = run;
+          v2.Value = random.Next(2) == 0;
+          v2.DataType = GetDataType(okb, platform, "bit");
+          okb.ResultBoolValues.InsertOnSubmit(v2);
+          return;
+        case "float":
+          ResultFloatValue v3 = new ResultFloatValue();
+          v3.Result = result;
+          v3.Run = run;
+          v3.Value = random.NextDouble();
+          v3.DataType = GetDataType(okb, platform, "float");
+          okb.ResultFloatValues.InsertOnSubmit(v3);
+          return;
+        case "bigint":
+          ResultIntValue v4 = new ResultIntValue();
+          v4.Result = result;
+          v4.Run = run;
+          v4.Value = random.Next();
+          v4.DataType = GetDataType(okb, platform, "bigint");
+          okb.ResultIntValues.InsertOnSubmit(v4);
+          return;
+        case "nvarchar":
+          ResultStringValue v5 = new ResultStringValue();
+          v5.Result = result;
+          v5.Run = run;
+          v5.Value = Guid.NewGuid().ToString();
+          v5.DataType = GetDataType(okb, platform, "nvarchar");
+          okb.ResultStringValues.InsertOnSubmit(v5);
+          return;
+      }
+    }
+  }
+}
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj	(revision 5296)
+++ branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/HeuristicLab.Services.OKB.DataAccess-3.3.Tests.csproj	(revision 5298)
@@ -47,6 +47,6 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="DBTests.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="UnitTest.cs" />
   </ItemGroup>
   <ItemGroup>
Index: branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/UnitTest.cs
===================================================================
--- branches/OKB (trunk integration)/HeuristicLab.Services.OKB.DataAccess/3.3/Tests/UnitTest.cs	(revision 5296)
+++ 	(revision )
@@ -1,466 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2010 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Data.Linq;
-using System.Linq;
-using HeuristicLab.Services.OKB.DataAccess;
-using Microsoft.VisualStudio.TestTools.UnitTesting;
-
-namespace HeuristicLab.Services.OKB.DataAccess_33.Tests {
-  /// <summary>
-  /// Summary description for UnitTest1
-  /// </summary>
-  [TestClass]
-  public class UnitTest {
-    private const int PLATFORMS = 1;
-    private const int DATATYPES_PER_PLATFORM = 500;
-    private const int ALGORITHMCLASSES_PER_PLATFORM = 10;
-    private const int ALGORITHMS_PER_CLASS = 10;
-    private const int PROBLEMCLASSES_PER_PLATFORM = 10;
-    private const int PROBLEMS_PER_CLASS = 10;
-    private const int PARAMETERS_PER_ALGORITHM = 10;
-    private const int RESULTS_PER_ALGORITHM = 10;
-    private const int PARAMETERS_PER_PROBLEM = 10;
-    private const int EXPERIMENTS_PER_PLATFORM = 1000;
-    private const int RUNS_PER_EXPERIMENT = 10;
-    private const int ALGORITHMDATA_SIZE = 1024 * 1024;
-    private const int PROBLEMDATA_SIZE = 1024 * 1024;
-    private const int BLOBVALUE_SIZE = 1024;
-
-    private string[] sqlNames = new string[] { "varbinary", "nvarchar", "float", "bit", "bigint" };
-    private Random random = new Random();
-    private DataType[] varbinaryTypes;
-    private DataType[] nvarcharTypes;
-    private DataType[] floatTypes;
-    private DataType[] bitTypes;
-    private DataType[] bigintTypes;
-
-    public UnitTest() {
-      //
-      // TODO: Add constructor logic here
-      //
-    }
-
-    private TestContext testContextInstance;
-
-    /// <summary>
-    ///Gets or sets the test context which provides
-    ///information about and functionality for the current test run.
-    ///</summary>
-    public TestContext TestContext {
-      get {
-        return testContextInstance;
-      }
-      set {
-        testContextInstance = value;
-      }
-    }
-
-    #region Additional test attributes
-    //
-    // You can use the following additional attributes as you write your tests:
-    //
-    // Use ClassInitialize to run code before running the first test in the class
-    // [ClassInitialize()]
-    // public static void MyClassInitialize(TestContext testContext) { }
-    //
-    // Use ClassCleanup to run code after all tests in a class have run
-    // [ClassCleanup()]
-    // public static void MyClassCleanup() { }
-    //
-    // Use TestInitialize to run code before running each test 
-    // [TestInitialize()]
-    // public void MyTestInitialize() { }
-    //
-    // Use TestCleanup to run code after each test has run
-    // [TestCleanup()]
-    // public void MyTestCleanup() { }
-    //
-    #endregion
-
-    [TestMethod]
-    public void ClearDB() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        okb.ExecuteCommand("DELETE FROM dbo.ResultBlobValue");
-        okb.ExecuteCommand("DELETE FROM dbo.ResultBoolValue");
-        okb.ExecuteCommand("DELETE FROM dbo.ResultFloatValue");
-        okb.ExecuteCommand("DELETE FROM dbo.ResultIntValue");
-        okb.ExecuteCommand("DELETE FROM dbo.ResultStringValue");
-
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterBlobValue");
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterBoolValue");
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterFloatValue");
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterIntValue");
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameterStringValue");
-
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterBlobValue");
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterBoolValue");
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterFloatValue");
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterIntValue");
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameterStringValue");
-
-        okb.ExecuteCommand("DELETE FROM dbo.Run");
-        okb.ExecuteCommand("DELETE FROM dbo.Experiment");
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmData");
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmUser");
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmParameter");
-        okb.ExecuteCommand("DELETE FROM dbo.Result");
-        okb.ExecuteCommand("DELETE FROM dbo.Algorithm");
-        okb.ExecuteCommand("DELETE FROM dbo.AlgorithmClass");
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemData");
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemUser");
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemParameter");
-        okb.ExecuteCommand("DELETE FROM dbo.Problem");
-        okb.ExecuteCommand("DELETE FROM dbo.ProblemClass");
-        okb.ExecuteCommand("DELETE FROM dbo.DataType");
-        okb.ExecuteCommand("DELETE FROM dbo.Platform");
-      }
-    }
-
-    [TestMethod]
-    public void InitDummyDB() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        for (int i = 0; i < PLATFORMS; i++) {
-          CreatePlatform(okb);
-        }
-        okb.SubmitChanges();
-      }
-    }
-
-    [TestMethod]
-    public void CreateDummyExperiments() {
-      using (OKBDataContext okb = new OKBDataContext()) {
-        foreach (Platform platform in okb.Platforms) {
-          for (int i = 0; i < EXPERIMENTS_PER_PLATFORM; i++) {
-            Algorithm[] algorithms = okb.Algorithms.Where(x => x.PlatformId == platform.Id).ToArray();
-            Problem[] problems = okb.Problems.Where(x => x.PlatformId == platform.Id).ToArray();
-            varbinaryTypes = null;
-            nvarcharTypes = null;
-            floatTypes = null;
-            bitTypes = null;
-            bigintTypes = null;
-
-            CreateExperiment(okb, algorithms[random.Next(algorithms.Length)], problems[random.Next(problems.Length)], platform);
-          }
-          okb.SubmitChanges();
-        }
-      }
-    }
-
-    private void CreatePlatform(OKBDataContext okb) {
-      Platform entity = new Platform();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.Description = Guid.NewGuid().ToString();
-      okb.Platforms.InsertOnSubmit(entity);
-
-      for (int i = 0; i < DATATYPES_PER_PLATFORM; i++) {
-        CreateDataType(okb, entity);
-      }
-      okb.SubmitChanges();
-
-      varbinaryTypes = null;
-      nvarcharTypes = null;
-      floatTypes = null;
-      bitTypes = null;
-      bigintTypes = null;
-
-      for (int i = 0; i < ALGORITHMCLASSES_PER_PLATFORM; i++) {
-        CreateAlgorithmClass(okb, entity);
-      }
-      for (int i = 0; i < PROBLEMCLASSES_PER_PLATFORM; i++) {
-        CreateProblemClass(okb, entity);
-      }
-    }
-    private void CreateDataType(OKBDataContext okb, Platform platform) {
-      DataType entity = new DataType();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.TypeName = Guid.NewGuid().ToString();
-      entity.SqlName = sqlNames[random.Next(sqlNames.Length)];
-      entity.Platform = platform;
-      okb.DataTypes.InsertOnSubmit(entity);
-    }
-    private DataType GetDataType(OKBDataContext okb, Platform platform, string sqlName) {
-      if (varbinaryTypes == null) varbinaryTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "varbinary")).ToArray();
-      if (nvarcharTypes == null) nvarcharTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "nvarchar")).ToArray();
-      if (floatTypes == null) floatTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "float")).ToArray();
-      if (bitTypes == null) bitTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "bit")).ToArray();
-      if (bigintTypes == null) bigintTypes = okb.DataTypes.Where(x => (x.PlatformId == platform.Id) && (x.SqlName == "bigint")).ToArray();
-
-      switch (sqlName) {
-        case "varbinary": return varbinaryTypes[random.Next(varbinaryTypes.Length)];
-        case "nvarchar": return nvarcharTypes[random.Next(nvarcharTypes.Length)];
-        case "float": return floatTypes[random.Next(floatTypes.Length)];
-        case "bit": return bitTypes[random.Next(bitTypes.Length)];
-        case "bigint": return bigintTypes[random.Next(bigintTypes.Length)];
-        default: return null;
-      }
-    }
-    private void CreateAlgorithmClass(OKBDataContext okb, Platform platform) {
-      AlgorithmClass entity = new AlgorithmClass();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.Description = Guid.NewGuid().ToString();
-      for (int i = 0; i < ALGORITHMS_PER_CLASS; i++) {
-        CreateAlgorithm(okb, entity, platform);
-      }
-      okb.AlgorithmClasses.InsertOnSubmit(entity);
-    }
-    private void CreateProblemClass(OKBDataContext okb, Platform platform) {
-      ProblemClass entity = new ProblemClass();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.Description = Guid.NewGuid().ToString();
-      for (int i = 0; i < PROBLEMS_PER_CLASS; i++) {
-        CreateProblem(okb, entity, platform);
-      }
-      okb.ProblemClasses.InsertOnSubmit(entity);
-    }
-    private void CreateAlgorithm(OKBDataContext okb, AlgorithmClass algorithmClass, Platform platform) {
-      Algorithm entity = new Algorithm();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.Description = Guid.NewGuid().ToString();
-      entity.AlgorithmClass = algorithmClass;
-      entity.Platform = platform;
-      CreateAlgorithmData(okb, entity, platform);
-      for (int i = 0; i < PARAMETERS_PER_ALGORITHM; i++) {
-        CreateAlgorithmParameter(okb, entity, platform);
-      }
-      for (int i = 0; i < RESULTS_PER_ALGORITHM; i++) {
-        CreateResult(okb, entity, platform);
-      }
-      okb.Algorithms.InsertOnSubmit(entity);
-    }
-    private void CreateAlgorithmData(OKBDataContext okb, Algorithm algorithm, Platform platform) {
-      AlgorithmData entity = new AlgorithmData();
-      entity.Algorithm = algorithm;
-      entity.Data = new System.Data.Linq.Binary(new byte[ALGORITHMDATA_SIZE]);
-      entity.DataType = GetDataType(okb, platform, "varbinary");
-      okb.AlgorithmDatas.InsertOnSubmit(entity);
-    }
-    private void CreateAlgorithmParameter(OKBDataContext okb, Algorithm algorithm, Platform platform) {
-      AlgorithmParameter entity = new AlgorithmParameter();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.Alias = Guid.NewGuid().ToString();
-      entity.Description = Guid.NewGuid().ToString();
-      entity.Algorithm = algorithm;
-      entity.DataType = GetDataType(okb, platform, sqlNames[random.Next(sqlNames.Length)]);
-      okb.AlgorithmParameters.InsertOnSubmit(entity);
-    }
-    private void CreateResult(OKBDataContext okb, Algorithm algorithm, Platform platform) {
-      Result entity = new Result();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.Alias = Guid.NewGuid().ToString();
-      entity.Description = Guid.NewGuid().ToString();
-      entity.Algorithm = algorithm;
-      entity.DataType = GetDataType(okb, platform, sqlNames[random.Next(sqlNames.Length)]);
-      okb.Results.InsertOnSubmit(entity);
-    }
-    private void CreateProblem(OKBDataContext okb, ProblemClass problemClass, Platform platform) {
-      Problem entity = new Problem();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.Description = Guid.NewGuid().ToString();
-      entity.ProblemClass = problemClass;
-      entity.Platform = platform;
-      CreateProblemData(okb, entity, platform);
-      for (int i = 0; i < PARAMETERS_PER_PROBLEM; i++) {
-        CreateProblemParameter(okb, entity, platform);
-      }
-      okb.Problems.InsertOnSubmit(entity);
-    }
-    private void CreateProblemData(OKBDataContext okb, Problem problem, Platform platform) {
-      ProblemData entity = new ProblemData();
-      entity.Problem = problem;
-      entity.Data = new System.Data.Linq.Binary(new byte[PROBLEMDATA_SIZE]);
-      entity.DataType = GetDataType(okb, platform, "varbinary");
-      okb.ProblemDatas.InsertOnSubmit(entity);
-    }
-    private void CreateProblemParameter(OKBDataContext okb, Problem problem, Platform platform) {
-      ProblemParameter entity = new ProblemParameter();
-      entity.Name = Guid.NewGuid().ToString();
-      entity.Alias = Guid.NewGuid().ToString();
-      entity.Description = Guid.NewGuid().ToString();
-      entity.Problem = problem;
-      entity.DataType = GetDataType(okb, platform, sqlNames[random.Next(sqlNames.Length)]);
-      okb.ProblemParameters.InsertOnSubmit(entity);
-    }
-    private void CreateExperiment(OKBDataContext okb, Algorithm algorithm, Problem problem, Platform platform) {
-      Experiment entity = new Experiment();
-      entity.Algorithm = algorithm;
-      entity.Problem = problem;
-
-      foreach (AlgorithmParameter algorithmParameter in okb.AlgorithmParameters.Where(x => x.AlgorithmId == algorithm.Id)) {
-        CreateAlgorithmParameterValue(okb, algorithmParameter, entity, platform);
-      }
-      foreach (ProblemParameter problemParameter in okb.ProblemParameters.Where(x => x.ProblemId == problem.Id)) {
-        CreateProblemParameterValue(okb, problemParameter, entity, platform);
-      }
-
-      for (int i = 0; i < RUNS_PER_EXPERIMENT; i++) {
-        CreateRun(okb, entity, platform);
-      }
-      okb.Experiments.InsertOnSubmit(entity);
-    }
-    private void CreateAlgorithmParameterValue(OKBDataContext okb, AlgorithmParameter algorithmParameter, Experiment experiment, Platform platform) {
-      switch (algorithmParameter.DataType.SqlName) {
-        case "varbinary":
-          AlgorithmParameterBlobValue v1 = new AlgorithmParameterBlobValue();
-          v1.AlgorithmParameter = algorithmParameter;
-          v1.Experiment = experiment;
-          v1.Value = new Binary(new byte[BLOBVALUE_SIZE]);
-          v1.DataType = GetDataType(okb, platform, "varbinary");
-          okb.AlgorithmParameterBlobValues.InsertOnSubmit(v1);
-          return;
-        case "bit":
-          AlgorithmParameterBoolValue v2 = new AlgorithmParameterBoolValue();
-          v2.AlgorithmParameter = algorithmParameter;
-          v2.Experiment = experiment;
-          v2.Value = random.Next(2) == 0;
-          v2.DataType = GetDataType(okb, platform, "bit");
-          okb.AlgorithmParameterBoolValues.InsertOnSubmit(v2);
-          return;
-        case "float":
-          AlgorithmParameterFloatValue v3 = new AlgorithmParameterFloatValue();
-          v3.AlgorithmParameter = algorithmParameter;
-          v3.Experiment = experiment;
-          v3.Value = random.NextDouble();
-          v3.DataType = GetDataType(okb, platform, "float");
-          okb.AlgorithmParameterFloatValues.InsertOnSubmit(v3);
-          return;
-        case "bigint":
-          AlgorithmParameterIntValue v4 = new AlgorithmParameterIntValue();
-          v4.AlgorithmParameter = algorithmParameter;
-          v4.Experiment = experiment;
-          v4.Value = random.Next();
-          v4.DataType = GetDataType(okb, platform, "bigint");
-          okb.AlgorithmParameterIntValues.InsertOnSubmit(v4);
-          return;
-        case "nvarchar":
-          AlgorithmParameterStringValue v5 = new AlgorithmParameterStringValue();
-          v5.AlgorithmParameter = algorithmParameter;
-          v5.Experiment = experiment;
-          v5.Value = Guid.NewGuid().ToString();
-          v5.DataType = GetDataType(okb, platform, "nvarchar");
-          okb.AlgorithmParameterStringValues.InsertOnSubmit(v5);
-          return;
-      }
-    }
-    private void CreateProblemParameterValue(OKBDataContext okb, ProblemParameter problemParameter, Experiment experiment, Platform platform) {
-      switch (problemParameter.DataType.SqlName) {
-        case "varbinary":
-          ProblemParameterBlobValue v1 = new ProblemParameterBlobValue();
-          v1.ProblemParameter = problemParameter;
-          v1.Experiment = experiment;
-          v1.Value = new Binary(new byte[BLOBVALUE_SIZE]);
-          v1.DataType = GetDataType(okb, platform, "varbinary");
-          okb.ProblemParameterBlobValues.InsertOnSubmit(v1);
-          return;
-        case "bit":
-          ProblemParameterBoolValue v2 = new ProblemParameterBoolValue();
-          v2.ProblemParameter = problemParameter;
-          v2.Experiment = experiment;
-          v2.Value = random.Next(2) == 0;
-          v2.DataType = GetDataType(okb, platform, "bit");
-          okb.ProblemParameterBoolValues.InsertOnSubmit(v2);
-          return;
-        case "float":
-          ProblemParameterFloatValue v3 = new ProblemParameterFloatValue();
-          v3.ProblemParameter = problemParameter;
-          v3.Experiment = experiment;
-          v3.Value = random.NextDouble();
-          v3.DataType = GetDataType(okb, platform, "float");
-          okb.ProblemParameterFloatValues.InsertOnSubmit(v3);
-          return;
-        case "bigint":
-          ProblemParameterIntValue v4 = new ProblemParameterIntValue();
-          v4.ProblemParameter = problemParameter;
-          v4.Experiment = experiment;
-          v4.Value = random.Next();
-          v4.DataType = GetDataType(okb, platform, "bigint");
-          okb.ProblemParameterIntValues.InsertOnSubmit(v4);
-          return;
-        case "nvarchar":
-          ProblemParameterStringValue v5 = new ProblemParameterStringValue();
-          v5.ProblemParameter = problemParameter;
-          v5.Experiment = experiment;
-          v5.Value = Guid.NewGuid().ToString();
-          v5.DataType = GetDataType(okb, platform, "nvarchar");
-          okb.ProblemParameterStringValues.InsertOnSubmit(v5);
-          return;
-      }
-    }
-    private void CreateRun(OKBDataContext okb, Experiment experiment, Platform platform) {
-      Run entity = new Run();
-      entity.RandomSeed = random.Next();
-      entity.CreatedDate = DateTime.Now;
-      entity.UserId = Guid.NewGuid();
-      entity.ClientId = Guid.NewGuid();
-      entity.Experiment = experiment;
-
-      foreach (Result result in okb.Results.Where(x => x.AlgorithmId == experiment.AlgorithmId)) {
-        CreateResultValue(okb, result, entity, platform);
-      }
-      okb.Runs.InsertOnSubmit(entity);
-    }
-    private void CreateResultValue(OKBDataContext okb, Result result, Run run, Platform platform) {
-      switch (result.DataType.SqlName) {
-        case "varbinary":
-          ResultBlobValue v1 = new ResultBlobValue();
-          v1.Result = result;
-          v1.Run = run;
-          v1.Value = new Binary(new byte[BLOBVALUE_SIZE]);
-          v1.DataType = GetDataType(okb, platform, "varbinary");
-          okb.ResultBlobValues.InsertOnSubmit(v1);
-          return;
-        case "bit":
-          ResultBoolValue v2 = new ResultBoolValue();
-          v2.Result = result;
-          v2.Run = run;
-          v2.Value = random.Next(2) == 0;
-          v2.DataType = GetDataType(okb, platform, "bit");
-          okb.ResultBoolValues.InsertOnSubmit(v2);
-          return;
-        case "float":
-          ResultFloatValue v3 = new ResultFloatValue();
-          v3.Result = result;
-          v3.Run = run;
-          v3.Value = random.NextDouble();
-          v3.DataType = GetDataType(okb, platform, "float");
-          okb.ResultFloatValues.InsertOnSubmit(v3);
-          return;
-        case "bigint":
-          ResultIntValue v4 = new ResultIntValue();
-          v4.Result = result;
-          v4.Run = run;
-          v4.Value = random.Next();
-          v4.DataType = GetDataType(okb, platform, "bigint");
-          okb.ResultIntValues.InsertOnSubmit(v4);
-          return;
-        case "nvarchar":
-          ResultStringValue v5 = new ResultStringValue();
-          v5.Result = result;
-          v5.Run = run;
-          v5.Value = Guid.NewGuid().ToString();
-          v5.DataType = GetDataType(okb, platform, "nvarchar");
-          okb.ResultStringValues.InsertOnSubmit(v5);
-          return;
-      }
-    }
-  }
-}
