PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/Octokit.Tests/Clients/StatisticsClientTests.cs

https://gitlab.com/WoomyNightClub/GitHub-API-.NET
C# | 508 lines | 400 code | 108 blank | 0 comment | 0 complexity | a559c57b6963060cb0b18f4e04818912 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Threading;
  5. using System.Threading.Tasks;
  6. using NSubstitute;
  7. using Octokit.Helpers;
  8. using Xunit;
  9. namespace Octokit.Tests.Clients
  10. {
  11. public class StatisticsClientTests
  12. {
  13. public class TheCtor
  14. {
  15. [Fact]
  16. public void EnsuresNonNullArguments()
  17. {
  18. Assert.Throws<ArgumentNullException>(() => new StatisticsClient(null));
  19. }
  20. }
  21. public class TheGetContributorsMethod
  22. {
  23. [Fact]
  24. public async Task RequestsCorrectUrl()
  25. {
  26. var expectedEndPoint = new Uri("repos/owner/name/stats/contributors", UriKind.Relative);
  27. IReadOnlyList<Contributor> contributors = new ReadOnlyCollection<Contributor>(new[] { new Contributor() });
  28. var connection = Substitute.For<IApiConnection>();
  29. connection.GetQueuedOperation<Contributor>(expectedEndPoint, Args.CancellationToken)
  30. .Returns(Task.FromResult(contributors));
  31. var client = new StatisticsClient(connection);
  32. var result = await client.GetContributors("owner", "name");
  33. Assert.Equal(1, result.Count);
  34. }
  35. [Fact]
  36. public async Task RequestsCorrectUrlWithRepositoryId()
  37. {
  38. var expectedEndPoint = new Uri("repositories/1/stats/contributors", UriKind.Relative);
  39. IReadOnlyList<Contributor> contributors = new ReadOnlyCollection<Contributor>(new[] { new Contributor() });
  40. var connection = Substitute.For<IApiConnection>();
  41. connection.GetQueuedOperation<Contributor>(expectedEndPoint, Args.CancellationToken)
  42. .Returns(Task.FromResult(contributors));
  43. var client = new StatisticsClient(connection);
  44. var result = await client.GetContributors(1);
  45. Assert.Equal(1, result.Count);
  46. }
  47. [Fact]
  48. public async Task RequestsCorrectUrlWithCancellactionToken()
  49. {
  50. var expectedEndPoint = new Uri("repos/owner/name/stats/contributors", UriKind.Relative);
  51. IReadOnlyList<Contributor> contributors = new ReadOnlyCollection<Contributor>(new[] { new Contributor() });
  52. var cancellationToken = new CancellationToken(true);
  53. var connection = Substitute.For<IApiConnection>();
  54. connection.GetQueuedOperation<Contributor>(expectedEndPoint, cancellationToken)
  55. .Returns(Task.FromResult(contributors));
  56. var client = new StatisticsClient(connection);
  57. var result = await client.GetContributors("owner", "name", cancellationToken);
  58. Assert.Equal(1, result.Count);
  59. }
  60. [Fact]
  61. public async Task RequestsCorrectUrlWithRepositoryIdWithCancellactionToken()
  62. {
  63. var expectedEndPoint = new Uri("repositories/1/stats/contributors", UriKind.Relative);
  64. IReadOnlyList<Contributor> contributors = new ReadOnlyCollection<Contributor>(new[] { new Contributor() });
  65. var cancellationToken = new CancellationToken(true);
  66. var connection = Substitute.For<IApiConnection>();
  67. connection.GetQueuedOperation<Contributor>(expectedEndPoint, cancellationToken)
  68. .Returns(Task.FromResult(contributors));
  69. var client = new StatisticsClient(connection);
  70. var result = await client.GetContributors(1, cancellationToken);
  71. Assert.Equal(1, result.Count);
  72. }
  73. [Fact]
  74. public async Task EnsureNonNullArguments()
  75. {
  76. var client = new StatisticsClient(Substitute.For<IApiConnection>());
  77. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetContributors(null, "name"));
  78. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetContributors("owner", null));
  79. await Assert.ThrowsAsync<ArgumentException>(() => client.GetContributors("", "name"));
  80. await Assert.ThrowsAsync<ArgumentException>(() => client.GetContributors("owner", ""));
  81. }
  82. }
  83. public class TheGetCommitActivityForTheLastYearMethod
  84. {
  85. [Fact]
  86. public async Task RequestsCorrectUrl()
  87. {
  88. var expectedEndPoint = new Uri("repos/owner/name/stats/commit_activity", UriKind.Relative);
  89. var data = new WeeklyCommitActivity(new[] { 1, 2 }, 100, 42);
  90. IReadOnlyList<WeeklyCommitActivity> response = new ReadOnlyCollection<WeeklyCommitActivity>(new[] { data });
  91. var client = Substitute.For<IApiConnection>();
  92. client.GetQueuedOperation<WeeklyCommitActivity>(expectedEndPoint, Args.CancellationToken)
  93. .Returns(Task.FromResult(response));
  94. var statisticsClient = new StatisticsClient(client);
  95. var result = await statisticsClient.GetCommitActivity("owner", "name");
  96. Assert.Equal(2, result.Activity[0].Days.Count);
  97. Assert.Equal(1, result.Activity[0].Days[0]);
  98. Assert.Equal(2, result.Activity[0].Days[1]);
  99. Assert.Equal(100, result.Activity[0].Total);
  100. Assert.Equal(42, result.Activity[0].Week);
  101. }
  102. [Fact]
  103. public async Task RequestsCorrectUrlWithRepositoryId()
  104. {
  105. var expectedEndPoint = new Uri("repositories/1/stats/commit_activity", UriKind.Relative);
  106. var data = new WeeklyCommitActivity(new[] { 1, 2 }, 100, 42);
  107. IReadOnlyList<WeeklyCommitActivity> response = new ReadOnlyCollection<WeeklyCommitActivity>(new[] { data });
  108. var client = Substitute.For<IApiConnection>();
  109. client.GetQueuedOperation<WeeklyCommitActivity>(expectedEndPoint, Args.CancellationToken)
  110. .Returns(Task.FromResult(response));
  111. var statisticsClient = new StatisticsClient(client);
  112. var result = await statisticsClient.GetCommitActivity(1);
  113. Assert.Equal(2, result.Activity[0].Days.Count);
  114. Assert.Equal(1, result.Activity[0].Days[0]);
  115. Assert.Equal(2, result.Activity[0].Days[1]);
  116. Assert.Equal(100, result.Activity[0].Total);
  117. Assert.Equal(42, result.Activity[0].Week);
  118. }
  119. [Fact]
  120. public async Task RequestsCorrectUrlWithCancellationToken()
  121. {
  122. var expectedEndPoint = new Uri("repos/owner/name/stats/commit_activity", UriKind.Relative);
  123. var cancellationToken = new CancellationToken();
  124. var data = new WeeklyCommitActivity(new[] { 1, 2 }, 100, 42);
  125. IReadOnlyList<WeeklyCommitActivity> response = new ReadOnlyCollection<WeeklyCommitActivity>(new[] { data });
  126. var connection = Substitute.For<IApiConnection>();
  127. connection.GetQueuedOperation<WeeklyCommitActivity>(expectedEndPoint, cancellationToken)
  128. .Returns(Task.FromResult(response));
  129. var client = new StatisticsClient(connection);
  130. var result = await client.GetCommitActivity("owner", "name", cancellationToken);
  131. Assert.Equal(2, result.Activity[0].Days.Count);
  132. Assert.Equal(1, result.Activity[0].Days[0]);
  133. Assert.Equal(2, result.Activity[0].Days[1]);
  134. Assert.Equal(100, result.Activity[0].Total);
  135. Assert.Equal(42, result.Activity[0].Week);
  136. }
  137. [Fact]
  138. public async Task RequestsCorrectUrlWithRepositoryIdWithCancellationToken()
  139. {
  140. var expectedEndPoint = new Uri("repositories/1/stats/commit_activity", UriKind.Relative);
  141. var cancellationToken = new CancellationToken();
  142. var data = new WeeklyCommitActivity(new[] { 1, 2 }, 100, 42);
  143. IReadOnlyList<WeeklyCommitActivity> response = new ReadOnlyCollection<WeeklyCommitActivity>(new[] { data });
  144. var connection = Substitute.For<IApiConnection>();
  145. connection.GetQueuedOperation<WeeklyCommitActivity>(expectedEndPoint, cancellationToken)
  146. .Returns(Task.FromResult(response));
  147. var client = new StatisticsClient(connection);
  148. var result = await client.GetCommitActivity(1, cancellationToken);
  149. Assert.Equal(2, result.Activity[0].Days.Count);
  150. Assert.Equal(1, result.Activity[0].Days[0]);
  151. Assert.Equal(2, result.Activity[0].Days[1]);
  152. Assert.Equal(100, result.Activity[0].Total);
  153. Assert.Equal(42, result.Activity[0].Week);
  154. }
  155. [Fact]
  156. public async Task EnsureNonNullArguments()
  157. {
  158. var client = new StatisticsClient(Substitute.For<IApiConnection>());
  159. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetCommitActivity(null, "name"));
  160. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetCommitActivity("owner", null));
  161. await Assert.ThrowsAsync<ArgumentException>(() => client.GetCommitActivity("", "name"));
  162. await Assert.ThrowsAsync<ArgumentException>(() => client.GetCommitActivity("owner", ""));
  163. }
  164. }
  165. public class TheGetAdditionsAndDeletionsPerWeekMethod
  166. {
  167. [Fact]
  168. public async Task RequestsCorrectUrl()
  169. {
  170. var expectedEndPoint = new Uri("repos/owner/name/stats/code_frequency", UriKind.Relative);
  171. long firstTimestamp = 159670861;
  172. long secondTimestamp = 0;
  173. IReadOnlyList<long[]> data = new ReadOnlyCollection<long[]>(new[]
  174. {
  175. new[] { firstTimestamp, 10, 52 },
  176. new[] { secondTimestamp, 0, 9 }
  177. });
  178. var client = Substitute.For<IApiConnection>();
  179. client.GetQueuedOperation<long[]>(expectedEndPoint, Args.CancellationToken)
  180. .Returns(Task.FromResult(data));
  181. var statisticsClient = new StatisticsClient(client);
  182. var codeFrequency = await statisticsClient.GetCodeFrequency("owner", "name");
  183. Assert.Equal(2, codeFrequency.AdditionsAndDeletionsByWeek.Count);
  184. Assert.Equal(firstTimestamp.FromUnixTime(), codeFrequency.AdditionsAndDeletionsByWeek[0].Timestamp);
  185. Assert.Equal(10, codeFrequency.AdditionsAndDeletionsByWeek[0].Additions);
  186. Assert.Equal(52, codeFrequency.AdditionsAndDeletionsByWeek[0].Deletions);
  187. Assert.Equal(secondTimestamp.FromUnixTime(), codeFrequency.AdditionsAndDeletionsByWeek[1].Timestamp);
  188. Assert.Equal(0, codeFrequency.AdditionsAndDeletionsByWeek[1].Additions);
  189. Assert.Equal(9, codeFrequency.AdditionsAndDeletionsByWeek[1].Deletions);
  190. }
  191. [Fact]
  192. public async Task RequestsCorrectUrlWithRepositoryId()
  193. {
  194. var expectedEndPoint = new Uri("repositories/1/stats/code_frequency", UriKind.Relative);
  195. long firstTimestamp = 159670861;
  196. long secondTimestamp = 0;
  197. IReadOnlyList<long[]> data = new ReadOnlyCollection<long[]>(new[]
  198. {
  199. new[] { firstTimestamp, 10, 52 },
  200. new[] { secondTimestamp, 0, 9 }
  201. });
  202. var client = Substitute.For<IApiConnection>();
  203. client.GetQueuedOperation<long[]>(expectedEndPoint, Args.CancellationToken)
  204. .Returns(Task.FromResult(data));
  205. var statisticsClient = new StatisticsClient(client);
  206. var codeFrequency = await statisticsClient.GetCodeFrequency(1);
  207. Assert.Equal(2, codeFrequency.AdditionsAndDeletionsByWeek.Count);
  208. Assert.Equal(firstTimestamp.FromUnixTime(), codeFrequency.AdditionsAndDeletionsByWeek[0].Timestamp);
  209. Assert.Equal(10, codeFrequency.AdditionsAndDeletionsByWeek[0].Additions);
  210. Assert.Equal(52, codeFrequency.AdditionsAndDeletionsByWeek[0].Deletions);
  211. Assert.Equal(secondTimestamp.FromUnixTime(), codeFrequency.AdditionsAndDeletionsByWeek[1].Timestamp);
  212. Assert.Equal(0, codeFrequency.AdditionsAndDeletionsByWeek[1].Additions);
  213. Assert.Equal(9, codeFrequency.AdditionsAndDeletionsByWeek[1].Deletions);
  214. }
  215. [Fact]
  216. public async Task RequestsCorrectUrlWithCancellationToken()
  217. {
  218. var expectedEndPoint = new Uri("repos/owner/name/stats/code_frequency", UriKind.Relative);
  219. var cancellationToken = new CancellationToken();
  220. long firstTimestamp = 159670861;
  221. long secondTimestamp = 0;
  222. IReadOnlyList<long[]> data = new ReadOnlyCollection<long[]>(new[]
  223. {
  224. new[] { firstTimestamp, 10, 52 },
  225. new[] { secondTimestamp, 0, 9 }
  226. });
  227. var connection = Substitute.For<IApiConnection>();
  228. connection.GetQueuedOperation<long[]>(expectedEndPoint, cancellationToken)
  229. .Returns(Task.FromResult(data));
  230. var client = new StatisticsClient(connection);
  231. var codeFrequency = await client.GetCodeFrequency("owner", "name", cancellationToken);
  232. Assert.Equal(2, codeFrequency.AdditionsAndDeletionsByWeek.Count);
  233. Assert.Equal(firstTimestamp.FromUnixTime(), codeFrequency.AdditionsAndDeletionsByWeek[0].Timestamp);
  234. Assert.Equal(10, codeFrequency.AdditionsAndDeletionsByWeek[0].Additions);
  235. Assert.Equal(52, codeFrequency.AdditionsAndDeletionsByWeek[0].Deletions);
  236. Assert.Equal(secondTimestamp.FromUnixTime(), codeFrequency.AdditionsAndDeletionsByWeek[1].Timestamp);
  237. Assert.Equal(0, codeFrequency.AdditionsAndDeletionsByWeek[1].Additions);
  238. Assert.Equal(9, codeFrequency.AdditionsAndDeletionsByWeek[1].Deletions);
  239. }
  240. [Fact]
  241. public async Task RequestsCorrectUrlWithRepositoryIdWithCancellationToken()
  242. {
  243. var expectedEndPoint = new Uri("repositories/1/stats/code_frequency", UriKind.Relative);
  244. var cancellationToken = new CancellationToken();
  245. long firstTimestamp = 159670861;
  246. long secondTimestamp = 0;
  247. IReadOnlyList<long[]> data = new ReadOnlyCollection<long[]>(new[]
  248. {
  249. new[] { firstTimestamp, 10, 52 },
  250. new[] { secondTimestamp, 0, 9 }
  251. });
  252. var connection = Substitute.For<IApiConnection>();
  253. connection.GetQueuedOperation<long[]>(expectedEndPoint, cancellationToken)
  254. .Returns(Task.FromResult(data));
  255. var client = new StatisticsClient(connection);
  256. var codeFrequency = await client.GetCodeFrequency(1, cancellationToken);
  257. Assert.Equal(2, codeFrequency.AdditionsAndDeletionsByWeek.Count);
  258. Assert.Equal(firstTimestamp.FromUnixTime(), codeFrequency.AdditionsAndDeletionsByWeek[0].Timestamp);
  259. Assert.Equal(10, codeFrequency.AdditionsAndDeletionsByWeek[0].Additions);
  260. Assert.Equal(52, codeFrequency.AdditionsAndDeletionsByWeek[0].Deletions);
  261. Assert.Equal(secondTimestamp.FromUnixTime(), codeFrequency.AdditionsAndDeletionsByWeek[1].Timestamp);
  262. Assert.Equal(0, codeFrequency.AdditionsAndDeletionsByWeek[1].Additions);
  263. Assert.Equal(9, codeFrequency.AdditionsAndDeletionsByWeek[1].Deletions);
  264. }
  265. [Fact]
  266. public async Task EnsureNonNullArguments()
  267. {
  268. var client = new StatisticsClient(Substitute.For<IApiConnection>());
  269. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetCodeFrequency(null, "name"));
  270. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetCodeFrequency("owner", null));
  271. await Assert.ThrowsAsync<ArgumentException>(() => client.GetCodeFrequency("", "name"));
  272. await Assert.ThrowsAsync<ArgumentException>(() => client.GetCodeFrequency("owner", ""));
  273. }
  274. }
  275. public class TheGetWeeklyCommitCountsMethod
  276. {
  277. [Fact]
  278. public void RequestsCorrectUrl()
  279. {
  280. var expectedEndPoint = new Uri("repos/owner/name/stats/participation", UriKind.Relative);
  281. var client = Substitute.For<IApiConnection>();
  282. var statisticsClient = new StatisticsClient(client);
  283. statisticsClient.GetParticipation("owner", "name");
  284. client.Received().GetQueuedOperation<Participation>(expectedEndPoint, Args.CancellationToken);
  285. }
  286. [Fact]
  287. public void RequestsCorrectUrlWithRepositoryId()
  288. {
  289. var expectedEndPoint = new Uri("repositories/1/stats/participation", UriKind.Relative);
  290. var client = Substitute.For<IApiConnection>();
  291. var statisticsClient = new StatisticsClient(client);
  292. statisticsClient.GetParticipation(1);
  293. client.Received().GetQueuedOperation<Participation>(expectedEndPoint, Args.CancellationToken);
  294. }
  295. [Fact]
  296. public void RequestsCorrectUrlWithCancellationToken()
  297. {
  298. var expectedEndPoint = new Uri("repos/owner/name/stats/participation", UriKind.Relative);
  299. var cancellationToken = new CancellationToken();
  300. var client = Substitute.For<IApiConnection>();
  301. var statisticsClient = new StatisticsClient(client);
  302. statisticsClient.GetParticipation("owner", "name", cancellationToken);
  303. client.Received().GetQueuedOperation<Participation>(expectedEndPoint, cancellationToken);
  304. }
  305. [Fact]
  306. public void RequestsCorrectUrlWithRepositoryIdWithCancellationToken()
  307. {
  308. var expectedEndPoint = new Uri("repositories/1/stats/participation", UriKind.Relative);
  309. var cancellationToken = new CancellationToken();
  310. var client = Substitute.For<IApiConnection>();
  311. var statisticsClient = new StatisticsClient(client);
  312. statisticsClient.GetParticipation(1, cancellationToken);
  313. client.Received().GetQueuedOperation<Participation>(expectedEndPoint, cancellationToken);
  314. }
  315. [Fact]
  316. public async Task EnsureNonNullArguments()
  317. {
  318. var client = new StatisticsClient(Substitute.For<IApiConnection>());
  319. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetParticipation(null, "name"));
  320. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetParticipation("owner", null));
  321. await Assert.ThrowsAsync<ArgumentException>(() => client.GetParticipation("", "name"));
  322. await Assert.ThrowsAsync<ArgumentException>(() => client.GetParticipation("owner", ""));
  323. }
  324. }
  325. public class TheGetHourlyCommitCountsMethod
  326. {
  327. [Fact]
  328. public async Task RequestsCorrectUrl()
  329. {
  330. var expectedEndPoint = new Uri("repos/owner/name/stats/punch_card", UriKind.Relative);
  331. var client = Substitute.For<IApiConnection>();
  332. IReadOnlyList<int[]> data = new ReadOnlyCollection<int[]>(new[] { new[] { 2, 8, 42 } });
  333. client.GetQueuedOperation<int[]>(expectedEndPoint, Args.CancellationToken)
  334. .Returns(Task.FromResult(data));
  335. var statisticsClient = new StatisticsClient(client);
  336. var result = await statisticsClient.GetPunchCard("owner", "name");
  337. Assert.Equal(1, result.PunchPoints.Count);
  338. Assert.Equal(DayOfWeek.Tuesday, result.PunchPoints[0].DayOfWeek);
  339. Assert.Equal(8, result.PunchPoints[0].HourOfTheDay);
  340. Assert.Equal(42, result.PunchPoints[0].CommitCount);
  341. }
  342. [Fact]
  343. public async Task RequestsCorrectUrlWithRepositoryId()
  344. {
  345. var expectedEndPoint = new Uri("repositories/1/stats/punch_card", UriKind.Relative);
  346. var client = Substitute.For<IApiConnection>();
  347. IReadOnlyList<int[]> data = new ReadOnlyCollection<int[]>(new[] { new[] { 2, 8, 42 } });
  348. client.GetQueuedOperation<int[]>(expectedEndPoint, Args.CancellationToken)
  349. .Returns(Task.FromResult(data));
  350. var statisticsClient = new StatisticsClient(client);
  351. var result = await statisticsClient.GetPunchCard(1);
  352. Assert.Equal(1, result.PunchPoints.Count);
  353. Assert.Equal(DayOfWeek.Tuesday, result.PunchPoints[0].DayOfWeek);
  354. Assert.Equal(8, result.PunchPoints[0].HourOfTheDay);
  355. Assert.Equal(42, result.PunchPoints[0].CommitCount);
  356. }
  357. [Fact]
  358. public async Task RequestsCorrectUrlWithCancellationToken()
  359. {
  360. var expectedEndPoint = new Uri("repos/owner/name/stats/punch_card", UriKind.Relative);
  361. var cancellationToken = new CancellationToken();
  362. var connection = Substitute.For<IApiConnection>();
  363. IReadOnlyList<int[]> data = new ReadOnlyCollection<int[]>(new[] { new[] { 2, 8, 42 } });
  364. connection.GetQueuedOperation<int[]>(expectedEndPoint, cancellationToken)
  365. .Returns(Task.FromResult(data));
  366. var client = new StatisticsClient(connection);
  367. var result = await client.GetPunchCard("owner", "name", cancellationToken);
  368. Assert.Equal(1, result.PunchPoints.Count);
  369. Assert.Equal(DayOfWeek.Tuesday, result.PunchPoints[0].DayOfWeek);
  370. Assert.Equal(8, result.PunchPoints[0].HourOfTheDay);
  371. Assert.Equal(42, result.PunchPoints[0].CommitCount);
  372. }
  373. [Fact]
  374. public async Task RequestsCorrectUrlWithRepositoryIdWithCancellationToken()
  375. {
  376. var expectedEndPoint = new Uri("repositories/1/stats/punch_card", UriKind.Relative);
  377. var cancellationToken = new CancellationToken();
  378. var connection = Substitute.For<IApiConnection>();
  379. IReadOnlyList<int[]> data = new ReadOnlyCollection<int[]>(new[] { new[] { 2, 8, 42 } });
  380. connection.GetQueuedOperation<int[]>(expectedEndPoint, cancellationToken)
  381. .Returns(Task.FromResult(data));
  382. var client = new StatisticsClient(connection);
  383. var result = await client.GetPunchCard(1, cancellationToken);
  384. Assert.Equal(1, result.PunchPoints.Count);
  385. Assert.Equal(DayOfWeek.Tuesday, result.PunchPoints[0].DayOfWeek);
  386. Assert.Equal(8, result.PunchPoints[0].HourOfTheDay);
  387. Assert.Equal(42, result.PunchPoints[0].CommitCount);
  388. }
  389. [Fact]
  390. public async Task EnsureNonNullArguments()
  391. {
  392. var client = new StatisticsClient(Substitute.For<IApiConnection>());
  393. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetPunchCard(null, "name"));
  394. await Assert.ThrowsAsync<ArgumentNullException>(() => client.GetPunchCard("owner", null));
  395. await Assert.ThrowsAsync<ArgumentException>(() => client.GetPunchCard("", "name"));
  396. await Assert.ThrowsAsync<ArgumentException>(() => client.GetPunchCard("owner", ""));
  397. }
  398. }
  399. }
  400. }