1
0

SolutionTests.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. using Content.Shared.Chemistry.Components;
  2. using Content.Shared.FixedPoint;
  3. using NUnit.Framework;
  4. using Robust.Shared.IoC;
  5. using Robust.Shared.Prototypes;
  6. namespace Content.Tests.Shared.Chemistry;
  7. [TestFixture, Parallelizable, TestOf(typeof(Solution))]
  8. public sealed class SolutionTests : ContentUnitTest
  9. {
  10. [OneTimeSetUp]
  11. public void Setup()
  12. {
  13. IoCManager.Resolve<IPrototypeManager>().Initialize();
  14. }
  15. [Test]
  16. public void AddReagentAndGetSolution()
  17. {
  18. var solution = new Solution();
  19. solution.AddReagent("water", FixedPoint2.New(1000));
  20. var quantity = solution.GetTotalPrototypeQuantity("water");
  21. Assert.That(quantity.Int(), Is.EqualTo(1000));
  22. }
  23. [Test]
  24. public void ScaleSolution()
  25. {
  26. var solution = new Solution();
  27. solution.AddReagent("water", FixedPoint2.New(20));
  28. solution.AddReagent("fire", FixedPoint2.New(30));
  29. // Test integer scaling
  30. {
  31. var tmp = solution.Clone();
  32. tmp.ScaleSolution(0);
  33. Assert.That(tmp.Contents.Count, Is.EqualTo(0));
  34. Assert.That(tmp.Volume, Is.EqualTo(FixedPoint2.Zero));
  35. tmp = solution.Clone();
  36. tmp.ScaleSolution(2);
  37. Assert.That(tmp.Contents.Count, Is.EqualTo(2));
  38. Assert.That(tmp.Volume, Is.EqualTo(FixedPoint2.New(100)));
  39. Assert.That(tmp.GetTotalPrototypeQuantity("water"), Is.EqualTo(FixedPoint2.New(40)));
  40. Assert.That(tmp.GetTotalPrototypeQuantity("fire"), Is.EqualTo(FixedPoint2.New(60)));
  41. }
  42. // Test float scaling
  43. {
  44. var tmp = solution.Clone();
  45. tmp.ScaleSolution(0f);
  46. Assert.That(tmp.Contents.Count, Is.EqualTo(0));
  47. Assert.That(tmp.Volume, Is.EqualTo(FixedPoint2.Zero));
  48. tmp = solution.Clone();
  49. tmp.ScaleSolution(2f);
  50. Assert.That(tmp.Contents.Count, Is.EqualTo(2));
  51. Assert.That(tmp.Volume, Is.EqualTo(FixedPoint2.New(100)));
  52. Assert.That(tmp.GetTotalPrototypeQuantity("water"), Is.EqualTo(FixedPoint2.New(40)));
  53. Assert.That(tmp.GetTotalPrototypeQuantity("fire"), Is.EqualTo(FixedPoint2.New(60)));
  54. tmp = solution.Clone();
  55. tmp.ScaleSolution(0.3f);
  56. Assert.That(tmp.Contents.Count, Is.EqualTo(2));
  57. Assert.That(tmp.Volume, Is.EqualTo(FixedPoint2.New(15)));
  58. Assert.That(tmp.GetTotalPrototypeQuantity("water"), Is.EqualTo(FixedPoint2.New(6)));
  59. Assert.That(tmp.GetTotalPrototypeQuantity("fire"), Is.EqualTo(FixedPoint2.New(9)));
  60. }
  61. }
  62. [Test]
  63. public void ConstructorAddReagent()
  64. {
  65. var solution = new Solution("water", FixedPoint2.New(1000));
  66. var quantity = solution.GetTotalPrototypeQuantity("water");
  67. Assert.That(quantity.Int(), Is.EqualTo(1000));
  68. }
  69. [Test]
  70. public void NonExistingReagentReturnsZero()
  71. {
  72. var solution = new Solution();
  73. var quantity = solution.GetTotalPrototypeQuantity("water");
  74. Assert.That(quantity.Int(), Is.EqualTo(0));
  75. }
  76. #if !DEBUG
  77. [Test]
  78. public void AddLessThanZeroReagentReturnsZero()
  79. {
  80. var solution = new Solution("water", FixedPoint2.New(-1000));
  81. var quantity = solution.GetTotalPrototypeQuantity("water");
  82. Assert.That(quantity.Int(), Is.EqualTo(0));
  83. }
  84. #endif
  85. [Test]
  86. public void AddingReagentsSumsProperly()
  87. {
  88. var solution = new Solution();
  89. solution.AddReagent("water", FixedPoint2.New(1000));
  90. solution.AddReagent("water", FixedPoint2.New(2000));
  91. var quantity = solution.GetTotalPrototypeQuantity("water");
  92. Assert.That(quantity.Int(), Is.EqualTo(3000));
  93. }
  94. [Test]
  95. public void ReagentQuantitiesStayUnique()
  96. {
  97. var solution = new Solution();
  98. solution.AddReagent("water", FixedPoint2.New(1000));
  99. solution.AddReagent("fire", FixedPoint2.New(2000));
  100. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(1000));
  101. Assert.That(solution.GetTotalPrototypeQuantity("fire").Int(), Is.EqualTo(2000));
  102. }
  103. [Test]
  104. public void TotalVolumeIsCorrect()
  105. {
  106. var solution = new Solution();
  107. solution.AddReagent("water", FixedPoint2.New(1000));
  108. solution.AddReagent("fire", FixedPoint2.New(2000));
  109. Assert.That(solution.Volume.Int(), Is.EqualTo(3000));
  110. }
  111. [Test]
  112. public void CloningSolutionIsCorrect()
  113. {
  114. var solution = new Solution();
  115. solution.AddReagent("water", FixedPoint2.New(1000));
  116. solution.AddReagent("fire", FixedPoint2.New(2000));
  117. var newSolution = solution.Clone();
  118. Assert.That(newSolution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(1000));
  119. Assert.That(newSolution.GetTotalPrototypeQuantity("fire").Int(), Is.EqualTo(2000));
  120. Assert.That(newSolution.Volume.Int(), Is.EqualTo(3000));
  121. }
  122. [Test]
  123. public void RemoveSolutionRecalculatesProperly()
  124. {
  125. var solution = new Solution();
  126. solution.AddReagent("water", FixedPoint2.New(1000));
  127. solution.AddReagent("fire", FixedPoint2.New(2000));
  128. solution.RemoveReagent("water", FixedPoint2.New(500));
  129. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(500));
  130. Assert.That(solution.GetTotalPrototypeQuantity("fire").Int(), Is.EqualTo(2000));
  131. Assert.That(solution.Volume.Int(), Is.EqualTo(2500));
  132. }
  133. [Test]
  134. public void RemoveLessThanOneQuantityDoesNothing()
  135. {
  136. var solution = new Solution("water", FixedPoint2.New(100));
  137. solution.RemoveReagent("water", FixedPoint2.New(-100));
  138. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(100));
  139. Assert.That(solution.Volume.Int(), Is.EqualTo(100));
  140. }
  141. [Test]
  142. public void RemoveMoreThanTotalRemovesAllReagent()
  143. {
  144. var solution = new Solution("water", FixedPoint2.New(100));
  145. solution.RemoveReagent("water", FixedPoint2.New(1000));
  146. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(0));
  147. Assert.That(solution.Volume.Int(), Is.EqualTo(0));
  148. }
  149. [Test]
  150. public void RemoveNonExistReagentDoesNothing()
  151. {
  152. var solution = new Solution("water", FixedPoint2.New(100));
  153. solution.RemoveReagent("fire", FixedPoint2.New(1000));
  154. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(100));
  155. Assert.That(solution.Volume.Int(), Is.EqualTo(100));
  156. }
  157. [Test]
  158. public void RemoveSolution()
  159. {
  160. var solution = new Solution("water", FixedPoint2.New(700));
  161. solution.RemoveSolution(FixedPoint2.New(500));
  162. //Check that edited solution is correct
  163. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(200));
  164. Assert.That(solution.Volume.Int(), Is.EqualTo(200));
  165. }
  166. [Test]
  167. public void RemoveSolutionMoreThanTotalRemovesAll()
  168. {
  169. var solution = new Solution("water", FixedPoint2.New(800));
  170. solution.RemoveSolution(FixedPoint2.New(1000));
  171. //Check that edited solution is correct
  172. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(0));
  173. Assert.That(solution.Volume.Int(), Is.EqualTo(0));
  174. }
  175. [Test]
  176. public void RemoveSolutionRatioPreserved()
  177. {
  178. var solution = new Solution();
  179. solution.AddReagent("water", FixedPoint2.New(1000));
  180. solution.AddReagent("fire", FixedPoint2.New(2000));
  181. solution.RemoveSolution(FixedPoint2.New(1500));
  182. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(500));
  183. Assert.That(solution.GetTotalPrototypeQuantity("fire").Int(), Is.EqualTo(1000));
  184. Assert.That(solution.Volume.Int(), Is.EqualTo(1500));
  185. }
  186. [Test]
  187. public void RemoveSolutionLessThanOneDoesNothing()
  188. {
  189. var solution = new Solution("water", FixedPoint2.New(800));
  190. solution.RemoveSolution(FixedPoint2.New(-200));
  191. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(800));
  192. Assert.That(solution.Volume.Int(), Is.EqualTo(800));
  193. }
  194. [Test]
  195. public void SplitSolution()
  196. {
  197. var solution = new Solution();
  198. solution.AddReagent("water", FixedPoint2.New(1000));
  199. solution.AddReagent("fire", FixedPoint2.New(2000));
  200. var splitSolution = solution.SplitSolution(FixedPoint2.New(750));
  201. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(750));
  202. Assert.That(solution.GetTotalPrototypeQuantity("fire").Int(), Is.EqualTo(1500));
  203. Assert.That(solution.Volume.Int(), Is.EqualTo(2250));
  204. Assert.That(splitSolution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(250));
  205. Assert.That(splitSolution.GetTotalPrototypeQuantity("fire").Int(), Is.EqualTo(500));
  206. Assert.That(splitSolution.Volume.Int(), Is.EqualTo(750));
  207. }
  208. [Test]
  209. public void SplitSolutionFractional()
  210. {
  211. var solution = new Solution();
  212. solution.AddReagent("water", FixedPoint2.New(1));
  213. solution.AddReagent("fire", FixedPoint2.New(2));
  214. var splitSolution = solution.SplitSolution(FixedPoint2.New(1));
  215. Assert.That(solution.GetTotalPrototypeQuantity("water").Float(), Is.EqualTo(0.66f));
  216. Assert.That(solution.GetTotalPrototypeQuantity("fire").Float(), Is.EqualTo(1.34f));
  217. Assert.That(solution.Volume.Int(), Is.EqualTo(2));
  218. Assert.That(splitSolution.GetTotalPrototypeQuantity("water").Float(), Is.EqualTo(0.34f));
  219. Assert.That(splitSolution.GetTotalPrototypeQuantity("fire").Float(), Is.EqualTo(0.66f));
  220. Assert.That(splitSolution.Volume.Int(), Is.EqualTo(1));
  221. }
  222. [Test]
  223. public void SplitSolutionFractionalOpposite()
  224. {
  225. var solution = new Solution();
  226. solution.AddReagent("water", FixedPoint2.New(1));
  227. solution.AddReagent("fire", FixedPoint2.New(2));
  228. var splitSolution = solution.SplitSolution(FixedPoint2.New(2));
  229. Assert.That(solution.GetTotalPrototypeQuantity("water").Float(), Is.EqualTo(0.33f));
  230. Assert.That(solution.GetTotalPrototypeQuantity("fire").Float(), Is.EqualTo(0.67f));
  231. Assert.That(solution.Volume.Int(), Is.EqualTo(1));
  232. Assert.That(splitSolution.GetTotalPrototypeQuantity("water").Float(), Is.EqualTo(0.67f));
  233. Assert.That(splitSolution.GetTotalPrototypeQuantity("fire").Float(), Is.EqualTo(1.33f));
  234. Assert.That(splitSolution.Volume.Int(), Is.EqualTo(2));
  235. }
  236. [Test]
  237. [TestCase(0.03f, 0.01f, 0.02f)]
  238. [TestCase(0.03f, 0.02f, 0.01f)]
  239. public void SplitSolutionTinyFractionalBigSmall(float initial, float reduce, float remainder)
  240. {
  241. var solution = new Solution();
  242. solution.AddReagent("water", FixedPoint2.New(initial));
  243. var splitSolution = solution.SplitSolution(FixedPoint2.New(reduce));
  244. Assert.That(solution.GetTotalPrototypeQuantity("water").Float(), Is.EqualTo(remainder));
  245. Assert.That(solution.Volume.Float(), Is.EqualTo(remainder));
  246. Assert.That(splitSolution.GetTotalPrototypeQuantity("water").Float(), Is.EqualTo(reduce));
  247. Assert.That(splitSolution.Volume.Float(), Is.EqualTo(reduce));
  248. }
  249. [Test]
  250. [TestCase(2)]
  251. [TestCase(10)]
  252. [TestCase(100)]
  253. [TestCase(1000)]
  254. public void SplitRounding(int amount)
  255. {
  256. var solutionOne = new Solution();
  257. solutionOne.AddReagent("foo", FixedPoint2.New(amount));
  258. solutionOne.AddReagent("bar", FixedPoint2.New(amount));
  259. solutionOne.AddReagent("baz", FixedPoint2.New(amount));
  260. var splitAmount = FixedPoint2.New(5);
  261. var split = solutionOne.SplitSolution(splitAmount);
  262. Assert.That(split.Volume, Is.EqualTo(splitAmount));
  263. }
  264. [Test]
  265. public void SplitSolutionMoreThanTotalRemovesAll()
  266. {
  267. var solution = new Solution("water", FixedPoint2.New(800));
  268. var splitSolution = solution.SplitSolution(FixedPoint2.New(1000));
  269. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(0));
  270. Assert.That(solution.Volume.Int(), Is.EqualTo(0));
  271. Assert.That(splitSolution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(800));
  272. Assert.That(splitSolution.Volume.Int(), Is.EqualTo(800));
  273. }
  274. [Test]
  275. public void SplitSolutionLessThanOneDoesNothing()
  276. {
  277. var solution = new Solution("water", FixedPoint2.New(800));
  278. var splitSolution = solution.SplitSolution(FixedPoint2.New(-200));
  279. Assert.That(solution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(800));
  280. Assert.That(solution.Volume.Int(), Is.EqualTo(800));
  281. Assert.That(splitSolution.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(0));
  282. Assert.That(splitSolution.Volume.Int(), Is.EqualTo(0));
  283. }
  284. [Test]
  285. public void SplitSolutionZero()
  286. {
  287. var solution = new Solution();
  288. solution.AddReagent("Impedrezene", FixedPoint2.New(0.01 + 0.19));
  289. solution.AddReagent("Thermite", FixedPoint2.New(0.01 + 0.39));
  290. solution.AddReagent("Li", FixedPoint2.New(0.01 + 0.17));
  291. solution.AddReagent("F", FixedPoint2.New(0.01 + 0.17));
  292. solution.AddReagent("Na", FixedPoint2.New(0 + 0.13));
  293. solution.AddReagent("Hg", FixedPoint2.New(0.15 + 4.15));
  294. solution.AddReagent("Cu", FixedPoint2.New(0 + 0.13));
  295. solution.AddReagent("U", FixedPoint2.New(0.76 + 20.77));
  296. solution.AddReagent("Fe", FixedPoint2.New(0.01 + 0.36));
  297. solution.AddReagent("SpaceDrugs", FixedPoint2.New(0.02 + 0.41));
  298. solution.AddReagent("Al", FixedPoint2.New(0));
  299. solution.AddReagent("Glucose", FixedPoint2.New(0));
  300. solution.AddReagent("O", FixedPoint2.New(0));
  301. solution.SplitSolution(FixedPoint2.New(0.98));
  302. }
  303. [Test]
  304. public void AddSolution()
  305. {
  306. var solutionOne = new Solution();
  307. solutionOne.AddReagent("water", FixedPoint2.New(1000));
  308. solutionOne.AddReagent("fire", FixedPoint2.New(2000));
  309. var solutionTwo = new Solution();
  310. solutionTwo.AddReagent("water", FixedPoint2.New(500));
  311. solutionTwo.AddReagent("earth", FixedPoint2.New(1000));
  312. solutionOne.AddSolution(solutionTwo, null);
  313. Assert.That(solutionOne.GetTotalPrototypeQuantity("water").Int(), Is.EqualTo(1500));
  314. Assert.That(solutionOne.GetTotalPrototypeQuantity("fire").Int(), Is.EqualTo(2000));
  315. Assert.That(solutionOne.GetTotalPrototypeQuantity("earth").Int(), Is.EqualTo(1000));
  316. Assert.That(solutionOne.Volume.Int(), Is.EqualTo(4500));
  317. }
  318. // Tests concerning thermal energy and temperature.
  319. #region Thermal Energy and Temperature
  320. [Test]
  321. public void EmptySolutionHasNoHeatCapacity()
  322. {
  323. var solution = new Solution();
  324. Assert.That(solution.GetHeatCapacity(null), Is.EqualTo(0.0f));
  325. }
  326. [Test]
  327. public void AddReagentWithNullTemperatureDoesNotEffectTemperature()
  328. {
  329. const float initialTemp = 100.0f;
  330. var solution = new Solution("water", FixedPoint2.New(100)) { Temperature = initialTemp };
  331. solution.AddReagent("water", FixedPoint2.New(100));
  332. Assert.That(solution.Temperature, Is.EqualTo(initialTemp));
  333. solution.AddReagent("earth", FixedPoint2.New(100));
  334. Assert.That(solution.Temperature, Is.EqualTo(initialTemp));
  335. }
  336. [Test]
  337. public void AddSolutionWithEqualTemperatureDoesNotChangeTemperature()
  338. {
  339. const float initialTemp = 100.0f;
  340. var solutionOne = new Solution();
  341. solutionOne.AddReagent("water", FixedPoint2.New(100));
  342. solutionOne.Temperature = initialTemp;
  343. var solutionTwo = new Solution();
  344. solutionTwo.AddReagent("water", FixedPoint2.New(100));
  345. solutionTwo.AddReagent("earth", FixedPoint2.New(100));
  346. solutionTwo.Temperature = initialTemp;
  347. solutionOne.AddSolution(solutionTwo, null);
  348. Assert.That(solutionOne.Temperature, Is.EqualTo(initialTemp));
  349. }
  350. [Test]
  351. public void RemoveReagentDoesNotEffectTemperature()
  352. {
  353. const float initialTemp = 100.0f;
  354. var solution = new Solution("water", FixedPoint2.New(100)) { Temperature = initialTemp };
  355. solution.RemoveReagent("water", FixedPoint2.New(50));
  356. Assert.That(solution.Temperature, Is.EqualTo(initialTemp));
  357. }
  358. [Test]
  359. public void RemoveSolutionDoesNotEffectTemperature()
  360. {
  361. const float initialTemp = 100.0f;
  362. var solution = new Solution("water", FixedPoint2.New(100)) { Temperature = initialTemp };
  363. solution.RemoveSolution(FixedPoint2.New(50));
  364. Assert.That(solution.Temperature, Is.EqualTo(initialTemp));
  365. }
  366. [Test]
  367. public void SplitSolutionDoesNotEffectTemperature()
  368. {
  369. const float initialTemp = 100.0f;
  370. var solution = new Solution("water", FixedPoint2.New(100)) { Temperature = initialTemp };
  371. solution.SplitSolution(FixedPoint2.New(50));
  372. Assert.That(solution.Temperature, Is.EqualTo(initialTemp));
  373. }
  374. #endregion Thermal Energy and Temperature
  375. }