PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/EntityGraph/EntityGraphTests.Silverlight/EntityGraphTests/Tests/CarParkExample.cs

#
C# | 316 lines | 300 code | 16 blank | 0 comment | 16 complexity | e9df7cf35dcb79be06afa80e92b4f980 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Collections.ObjectModel;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Linq;
  5. using System.ServiceModel.DomainServices.Client;
  6. using Microsoft.VisualStudio.TestTools.UnitTesting;
  7. using RiaServicesContrib;
  8. using RiaServicesContrib.DataValidation;
  9. using RiaServicesContrib.DomainServices.Client;
  10. using RiaServicesContrib.DomainServices.Client.DataValidation;
  11. namespace EntityGraphTests.Tests
  12. {
  13. public class Wheel : Entity
  14. {
  15. }
  16. public enum EngineType
  17. {
  18. Diesel,
  19. Benzin,
  20. Gaz
  21. }
  22. public class Engine : Entity
  23. {
  24. private EngineType _engineType;
  25. public EngineType EngineType
  26. {
  27. get { return _engineType; }
  28. set
  29. {
  30. if(_engineType != value)
  31. {
  32. _engineType = value;
  33. RaisePropertyChanged("EngineType");
  34. }
  35. }
  36. }
  37. }
  38. public class Door : Entity
  39. {
  40. }
  41. public abstract class Car : Entity
  42. {
  43. public string _id;
  44. public string Id
  45. {
  46. get { return _id; }
  47. set
  48. {
  49. if(_id != value)
  50. {
  51. _id = value;
  52. RaisePropertyChanged("Id");
  53. }
  54. }
  55. }
  56. public ObservableCollection<Wheel> Wheels { get; set; }
  57. public ObservableCollection<Door> Doors { get; set; }
  58. public Engine Engine { get; set; }
  59. public Owner Owner { get; set; }
  60. }
  61. public class Owner
  62. {
  63. }
  64. public class Trailer : Entity
  65. {
  66. }
  67. public class Truck : Car
  68. {
  69. public Truck()
  70. {
  71. Wheels = new ObservableCollection<Wheel>{
  72. new Wheel(),
  73. new Wheel(),
  74. new Wheel(),
  75. new Wheel(),
  76. new Wheel(),
  77. new Wheel()};
  78. Doors = new ObservableCollection<Door>{
  79. new Door(),
  80. new Door()};
  81. Engine = new Engine { EngineType = EngineType.Diesel };
  82. }
  83. private Trailer _trailer;
  84. public Trailer Trailer
  85. {
  86. get { return _trailer; }
  87. set
  88. {
  89. if(_trailer != value)
  90. {
  91. _trailer = value;
  92. RaisePropertyChanged("Trailer");
  93. }
  94. }
  95. }
  96. }
  97. public class PersonCar : Car
  98. {
  99. public PersonCar()
  100. {
  101. Wheels = new ObservableCollection<Wheel>{
  102. new Wheel(),
  103. new Wheel(),
  104. new Wheel(),
  105. new Wheel()};
  106. Doors = new ObservableCollection<Door>{
  107. new Door(),
  108. new Door(),
  109. new Door(),
  110. new Door()};
  111. Engine = new Engine { EngineType = EngineType.Benzin };
  112. }
  113. }
  114. public class CarPark : Entity
  115. {
  116. public ObservableCollection<Car> Cars { get; set; }
  117. private static EntityGraphShape _shape =
  118. new EntityGraphShape()
  119. .Edge<CarPark, Car>(CarPark => CarPark.Cars)
  120. .Edge<Car, Wheel>(Car => Car.Wheels)
  121. .Edge<Car, Door>(Car => Car.Doors)
  122. .Edge<Car, Engine>(Car => Car.Engine)
  123. .Edge<Truck, Trailer>(Truck => Truck.Trailer);
  124. public static EntityGraphShape Shape { get { return _shape; } }
  125. }
  126. public class UniqIds : ValidationRule
  127. {
  128. public UniqIds()
  129. : base(
  130. InputOutput<Car, string>(Car1 => Car1.Id),
  131. InputOutput<Car, string>(Car2 => Car2.Id)
  132. )
  133. { }
  134. public ValidationResult Validate(string carId1, string carId2)
  135. {
  136. if(carId1 == carId2)
  137. {
  138. return new ValidationResult("Car ids should be uniqe");
  139. }
  140. else
  141. {
  142. return ValidationResult.Success;
  143. }
  144. }
  145. }
  146. public class TruckDoorsValidator : ValidationRule
  147. {
  148. public TruckDoorsValidator() :
  149. base(InputOutput<Truck, IEnumerable<Door>>(Truck => Truck.Doors))
  150. { }
  151. public ValidationResult Validate(IEnumerable<Door> doors)
  152. {
  153. if(doors.Count() > 2)
  154. {
  155. return new ValidationResult("Truck has max 2 doors.");
  156. }
  157. else
  158. {
  159. return ValidationResult.Success;
  160. }
  161. }
  162. }
  163. public class TruckEngineValidator : ValidationRule
  164. {
  165. public TruckEngineValidator() :
  166. base(
  167. InputOutput<Truck, Engine>(Truck => Truck.Engine),
  168. InputOnly<Truck, EngineType>(Truck => Truck.Engine.EngineType)
  169. )
  170. { }
  171. public ValidationResult Validate(Engine engine, EngineType engineType)
  172. {
  173. if(engineType != EngineType.Diesel)
  174. {
  175. return new ValidationResult("Truck should have a diesel engine.");
  176. }
  177. else
  178. {
  179. return ValidationResult.Success;
  180. }
  181. }
  182. }
  183. public class TruckWheelsValidator : ValidationRule
  184. {
  185. public TruckWheelsValidator() :
  186. base(InputOutput<Truck, IEnumerable<Wheel>>(Truck => Truck.Wheels)
  187. )
  188. { }
  189. public ValidationResult Validate(IEnumerable<Wheel> wheels)
  190. {
  191. if(wheels.Count() <= 4)
  192. {
  193. return new ValidationResult("Truck should have at least 4 wheels.");
  194. }
  195. return ValidationResult.Success;
  196. }
  197. }
  198. public class TruckTrailerValidator : ValidationRule
  199. {
  200. public TruckTrailerValidator() :
  201. base(
  202. InputOutput<Truck, Trailer>(Truck1 => Truck1.Trailer),
  203. InputOutput<Truck, Trailer>(Truck2 => Truck2.Trailer)
  204. )
  205. { }
  206. public ValidationResult Validate(Trailer trailer1, Trailer trailer2)
  207. {
  208. if(trailer1 != null && trailer1 == trailer2)
  209. {
  210. return new ValidationResult("A trailer can be attached to a single truck only");
  211. }
  212. else
  213. {
  214. return ValidationResult.Success;
  215. }
  216. }
  217. }
  218. [TestClass]
  219. public class CarsExampleTests
  220. {
  221. [TestMethod]
  222. public void UniqIdsTest()
  223. {
  224. var truck = new Truck { Id = "1" };
  225. var personCar = new PersonCar { Id = "2" };
  226. var carPark = new CarPark
  227. {
  228. Cars = new ObservableCollection<Car> { truck, personCar }
  229. };
  230. MEFValidationRules.RegisterType(typeof(UniqIds));
  231. var gr = carPark.EntityGraph(CarPark.Shape);
  232. Assert.IsFalse(truck.HasValidationErrors);
  233. Assert.IsFalse(personCar.HasValidationErrors);
  234. truck.Id = "2";
  235. Assert.IsTrue(truck.HasValidationErrors);
  236. Assert.IsTrue(personCar.HasValidationErrors);
  237. personCar.Id = "1";
  238. Assert.IsFalse(truck.HasValidationErrors);
  239. Assert.IsFalse(personCar.HasValidationErrors);
  240. MEFValidationRules.UnregisterType(typeof(UniqIds));
  241. }
  242. [TestMethod]
  243. public void TruckEquipmentTest()
  244. {
  245. var truck = new Truck { Id = "1" };
  246. var personCar = new PersonCar { Id = "2" };
  247. var carPark = new CarPark
  248. {
  249. Cars = new ObservableCollection<Car> { truck, personCar }
  250. };
  251. MEFValidationRules.RegisterType(typeof(TruckDoorsValidator));
  252. var gr = carPark.EntityGraph(CarPark.Shape);
  253. Assert.IsFalse(truck.HasValidationErrors);
  254. truck.Doors.Add(new Door());
  255. Assert.IsTrue(truck.HasValidationErrors);
  256. MEFValidationRules.UnregisterType(typeof(TruckDoorsValidator));
  257. }
  258. [TestMethod]
  259. public void TruckEngineTest()
  260. {
  261. var truck = new Truck { Id = "1" };
  262. var personCar = new PersonCar { Id = "2" };
  263. var carPark = new CarPark
  264. {
  265. Cars = new ObservableCollection<Car> { truck, personCar }
  266. };
  267. MEFValidationRules.RegisterType(typeof(TruckEngineValidator));
  268. var gr = carPark.EntityGraph(CarPark.Shape);
  269. Assert.IsFalse(truck.HasValidationErrors);
  270. Assert.IsFalse(truck.Engine.HasValidationErrors);
  271. truck.Engine.EngineType = EngineType.Benzin;
  272. Assert.IsTrue(truck.HasValidationErrors);
  273. Assert.IsFalse(truck.Engine.HasValidationErrors);
  274. truck.Engine.EngineType = EngineType.Diesel;
  275. Assert.IsFalse(truck.HasValidationErrors);
  276. Assert.IsFalse(truck.Engine.HasValidationErrors);
  277. MEFValidationRules.UnregisterType(typeof(TruckEngineValidator));
  278. }
  279. [TestMethod]
  280. public void TruckTrailerTest()
  281. {
  282. var truck1 = new Truck { Id = "1" };
  283. var truck2 = new Truck { Id = "2" };
  284. var trailer = new Trailer();
  285. var carPark = new CarPark
  286. {
  287. Cars = new ObservableCollection<Car> { truck1, truck2 }
  288. };
  289. MEFValidationRules.RegisterType(typeof(TruckTrailerValidator));
  290. var gr = carPark.EntityGraph(CarPark.Shape);
  291. truck1.Trailer = trailer;
  292. Assert.IsFalse(truck1.HasValidationErrors);
  293. Assert.IsFalse(truck2.HasValidationErrors);
  294. truck2.Trailer = trailer;
  295. Assert.IsTrue(truck1.HasValidationErrors);
  296. Assert.IsTrue(truck2.HasValidationErrors);
  297. MEFValidationRules.UnregisterType(typeof(TruckTrailerValidator));
  298. }
  299. }
  300. }