/src/EditorFeatures/CSharpTest/Organizing/OrganizeTypeDeclarationTests.cs

https://gitlab.com/sharadag/Roslyn · C# · 1129 lines · 1049 code · 78 blank · 2 comment · 0 complexity · cbe5f7ef4b7c4d9d334481db2ee80a5b MD5 · raw file

  1. // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
  2. using System;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using System.Xml.Linq;
  6. using Microsoft.CodeAnalysis.Editor.Implementation.Interactive;
  7. using Microsoft.CodeAnalysis.Editor.Implementation.Organizing;
  8. using Microsoft.CodeAnalysis.Editor.UnitTests;
  9. using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
  10. using Microsoft.CodeAnalysis.Text;
  11. using Microsoft.VisualStudio.Text.Operations;
  12. using Roslyn.Test.Utilities;
  13. using Xunit;
  14. namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Organizing
  15. {
  16. public class OrganizeTypeDeclarationTests : AbstractOrganizerTests
  17. {
  18. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  19. public async Task TestFieldsWithoutInitializers1()
  20. {
  21. var initial =
  22. @"class C {
  23. int A;
  24. int B;
  25. int C;
  26. }";
  27. var final =
  28. @"class C {
  29. int A;
  30. int B;
  31. int C;
  32. }";
  33. await CheckAsync(initial, final);
  34. }
  35. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  36. public async Task TestFieldsWithoutInitializers2()
  37. {
  38. var initial =
  39. @"class C {
  40. int C;
  41. int B;
  42. int A;
  43. }";
  44. var final =
  45. @"class C {
  46. int A;
  47. int B;
  48. int C;
  49. }";
  50. await CheckAsync(initial, final);
  51. }
  52. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  53. public async Task TestFieldsWithInitializers1()
  54. {
  55. var initial =
  56. @"class C {
  57. int C = 0;
  58. int B;
  59. int A;
  60. }";
  61. var final =
  62. @"class C {
  63. int A;
  64. int B;
  65. int C = 0;
  66. }";
  67. await CheckAsync(initial, final);
  68. }
  69. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  70. public async Task TestFieldsWithInitializers2()
  71. {
  72. var initial =
  73. @"class C {
  74. int C = 0;
  75. int B = 0;
  76. int A;
  77. }";
  78. var final =
  79. @"class C {
  80. int A;
  81. int C = 0;
  82. int B = 0;
  83. }";
  84. await CheckAsync(initial, final);
  85. }
  86. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  87. public async Task TestEventFieldDeclaration()
  88. {
  89. var initial =
  90. @"class C {
  91. public void Foo() {}
  92. public event EventHandler MyEvent;
  93. }";
  94. var final =
  95. @"class C {
  96. public event EventHandler MyEvent;
  97. public void Foo() {}
  98. }";
  99. await CheckAsync(initial, final);
  100. }
  101. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  102. public async Task TestEventDeclaration()
  103. {
  104. var initial =
  105. @"class C {
  106. public void Foo() {}
  107. public event EventHandler Event
  108. {
  109. remove { }
  110. add { }
  111. }
  112. public static int Property { get; set; }
  113. }";
  114. var final =
  115. @"class C {
  116. public static int Property { get; set; }
  117. public event EventHandler Event
  118. {
  119. remove { }
  120. add { }
  121. }
  122. public void Foo() {}
  123. }";
  124. await CheckAsync(initial, final);
  125. }
  126. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  127. public async Task TestOperator()
  128. {
  129. var initial =
  130. @"class C {
  131. public void Foo() {}
  132. public static int operator +(Foo<T> a, int b)
  133. {
  134. return 1;
  135. }
  136. }";
  137. var final =
  138. @"class C {
  139. public static int operator +(Foo<T> a, int b)
  140. {
  141. return 1;
  142. }
  143. public void Foo() {}
  144. }";
  145. await CheckAsync(initial, final);
  146. }
  147. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  148. public async Task TestIndexer()
  149. {
  150. var initial =
  151. @"class C {
  152. public void Foo() {}
  153. public T this[int i]
  154. {
  155. get
  156. {
  157. return default(T);
  158. }
  159. }
  160. C() {}
  161. }";
  162. var final =
  163. @"class C {
  164. C() {}
  165. public T this[int i]
  166. {
  167. get
  168. {
  169. return default(T);
  170. }
  171. }
  172. public void Foo() {}
  173. }";
  174. await CheckAsync(initial, final);
  175. }
  176. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  177. public async Task TestConstructorAndDestructors()
  178. {
  179. var initial =
  180. @"class C {
  181. public ~Foo() {}
  182. enum Days {Sat, Sun};
  183. public Foo() {}
  184. }";
  185. var final =
  186. @"class C {
  187. public ~Foo() {}
  188. public Foo() {}
  189. enum Days {Sat, Sun};
  190. }";
  191. await CheckAsync(initial, final);
  192. }
  193. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  194. public async Task TestInterface()
  195. {
  196. var initial =
  197. @"class C {}
  198. interface I
  199. {
  200. void Foo();
  201. int Property { get; set; }
  202. event EventHandler Event;
  203. }";
  204. var final =
  205. @"class C {}
  206. interface I
  207. {
  208. event EventHandler Event;
  209. int Property { get; set; }
  210. void Foo();
  211. }";
  212. await CheckAsync(initial, final);
  213. }
  214. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  215. public async Task TestStaticInstance()
  216. {
  217. var initial =
  218. @"class C {
  219. int A;
  220. static int B;
  221. int C;
  222. static int D;
  223. }";
  224. var final =
  225. @"class C {
  226. static int B;
  227. static int D;
  228. int A;
  229. int C;
  230. }";
  231. await CheckAsync(initial, final);
  232. }
  233. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  234. public async Task TestAccessibility()
  235. {
  236. var initial =
  237. @"class C {
  238. int A;
  239. private int B;
  240. internal int C;
  241. protected int D;
  242. public int E;
  243. protected internal int F;
  244. }";
  245. var final =
  246. @"class C {
  247. public int E;
  248. protected int D;
  249. protected internal int F;
  250. internal int C;
  251. int A;
  252. private int B;
  253. }";
  254. await CheckAsync(initial, final);
  255. }
  256. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  257. public async Task TestStaticAccessibility()
  258. {
  259. var initial =
  260. @"class C {
  261. int A1;
  262. private int B1;
  263. internal int C1;
  264. protected int D1;
  265. public int E1;
  266. static int A2;
  267. static private int B2;
  268. static internal int C2;
  269. static protected int D2;
  270. static public int E2;
  271. }";
  272. var final =
  273. @"class C {
  274. public static int E2;
  275. protected static int D2;
  276. internal static int C2;
  277. static int A2;
  278. private static int B2;
  279. public int E1;
  280. protected int D1;
  281. internal int C1;
  282. int A1;
  283. private int B1;
  284. }";
  285. await CheckAsync(initial, final);
  286. }
  287. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  288. public async Task TestGenerics()
  289. {
  290. var initial =
  291. @"class C {
  292. void B<X,Y>();
  293. void B<Z>();
  294. void B();
  295. void A<X,Y>();
  296. void A<Z>();
  297. void A();
  298. }";
  299. var final =
  300. @"class C {
  301. void A();
  302. void A<Z>();
  303. void A<X,Y>();
  304. void B();
  305. void B<Z>();
  306. void B<X,Y>();
  307. }";
  308. await CheckAsync(initial, final);
  309. }
  310. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  311. public async Task TestInsidePPRegion()
  312. {
  313. var initial =
  314. @"class C {
  315. #if true
  316. int c;
  317. int b;
  318. int a;
  319. #endif
  320. }";
  321. var final =
  322. @"class C {
  323. #if true
  324. int a;
  325. int b;
  326. int c;
  327. #endif
  328. }";
  329. await CheckAsync(initial, final);
  330. }
  331. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  332. public async Task TestInsidePPRegion2()
  333. {
  334. var initial =
  335. @"class C {
  336. #if true
  337. int z;
  338. int y;
  339. int x;
  340. #endif
  341. #if true
  342. int c;
  343. int b;
  344. int a;
  345. #endif
  346. }";
  347. var final =
  348. @"class C {
  349. #if true
  350. int x;
  351. int y;
  352. int z;
  353. #endif
  354. #if true
  355. int a;
  356. int b;
  357. int c;
  358. #endif
  359. }";
  360. await CheckAsync(initial, final);
  361. }
  362. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  363. public async Task TestInsidePPRegion3()
  364. {
  365. var initial =
  366. @"class C {
  367. int z;
  368. int y;
  369. #if true
  370. int x;
  371. int c;
  372. #endif
  373. int b;
  374. int a;
  375. }";
  376. var final =
  377. @"class C {
  378. int y;
  379. int z;
  380. #if true
  381. int c;
  382. int x;
  383. #endif
  384. int a;
  385. int b;
  386. }";
  387. await CheckAsync(initial, final);
  388. }
  389. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  390. public async Task TestInsidePPRegion4()
  391. {
  392. var initial =
  393. @"class C {
  394. int c() {
  395. }
  396. int b {
  397. }
  398. int a {
  399. #if true
  400. #endif
  401. }
  402. }";
  403. var final =
  404. @"class C {
  405. int a {
  406. #if true
  407. #endif
  408. }
  409. int b {
  410. }
  411. int c() {
  412. }
  413. }";
  414. await CheckAsync(initial, final);
  415. }
  416. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  417. public async Task TestInsidePPRegion5()
  418. {
  419. var initial =
  420. @"class C {
  421. int c() {
  422. }
  423. int b {
  424. }
  425. int a {
  426. #if true
  427. #else
  428. #endif
  429. }
  430. }";
  431. var final =
  432. @"class C {
  433. int a {
  434. #if true
  435. #else
  436. #endif
  437. }
  438. int b {
  439. }
  440. int c() {
  441. }
  442. }";
  443. await CheckAsync(initial, final);
  444. }
  445. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  446. public async Task TestInsidePPRegion6()
  447. {
  448. var initial =
  449. @"class C {
  450. #region
  451. int e() {
  452. }
  453. int d() {
  454. }
  455. int c() {
  456. #region
  457. }
  458. #endregion
  459. int b {
  460. }
  461. int a {
  462. }
  463. #endregion
  464. }";
  465. var final =
  466. @"class C {
  467. #region
  468. int d() {
  469. }
  470. int e() {
  471. }
  472. int c() {
  473. #region
  474. }
  475. #endregion
  476. int a {
  477. }
  478. int b {
  479. }
  480. #endregion
  481. }";
  482. await CheckAsync(initial, final);
  483. }
  484. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  485. public async Task TestPinned()
  486. {
  487. var initial =
  488. @"class C {
  489. int z() {
  490. }
  491. int y() {
  492. }
  493. int x() {
  494. #if true
  495. }
  496. int n;
  497. int m;
  498. int c() {
  499. #endif
  500. }
  501. int b() {
  502. }
  503. int a() {
  504. }
  505. }";
  506. var final =
  507. @"class C {
  508. int y() {
  509. }
  510. int z() {
  511. }
  512. int x() {
  513. #if true
  514. }
  515. int m;
  516. int n;
  517. int c() {
  518. #endif
  519. }
  520. int a() {
  521. }
  522. int b() {
  523. }
  524. }";
  525. await CheckAsync(initial, final);
  526. }
  527. [Fact, Trait(Traits.Feature, Traits.Features.Organizing)]
  528. public async Task TestSensitivity()
  529. {
  530. var initial =
  531. @"class C {
  532. int Bb;
  533. int B;
  534. int bB;
  535. int b;
  536. int Aa;
  537. int a;
  538. int A;
  539. int aa;
  540. int aA;
  541. int AA;
  542. int bb;
  543. int BB;
  544. int bBb;
  545. int bbB;
  546. int ;
  547. int ;
  548. int ;
  549. int ああ;
  550. int あア;
  551. int あア;
  552. int アあ;
  553. int cC;
  554. int Cc;
  555. int アア;
  556. int アア;
  557. int アあ;
  558. int アア;
  559. int アア;
  560. int BBb;
  561. int BbB;
  562. int bBB;
  563. int BBB;
  564. int c;
  565. int C;
  566. int bbb;
  567. int Bbb;
  568. int cc;
  569. int cC;
  570. int CC;
  571. }";
  572. var final =
  573. @"class C {
  574. int a;
  575. int A;
  576. int aa;
  577. int aA;
  578. int Aa;
  579. int AA;
  580. int b;
  581. int B;
  582. int bb;
  583. int bB;
  584. int Bb;
  585. int BB;
  586. int bbb;
  587. int bbB;
  588. int bBb;
  589. int bBB;
  590. int Bbb;
  591. int BbB;
  592. int BBb;
  593. int BBB;
  594. int c;
  595. int C;
  596. int cc;
  597. int cC;
  598. int cC;
  599. int Cc;
  600. int CC;
  601. int ;
  602. int ;
  603. int ;
  604. int アア;
  605. int アア;
  606. int アア;
  607. int アア;
  608. int アあ;
  609. int アあ;
  610. int あア;
  611. int あア;
  612. int ああ;
  613. }";
  614. await CheckAsync(initial, final);
  615. }
  616. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  617. [Fact]
  618. public async Task TestWhitespaceBetweenMethods1()
  619. {
  620. var initial =
  621. @"class Program
  622. {
  623. void B()
  624. {
  625. }
  626. void A()
  627. {
  628. }
  629. }";
  630. var final =
  631. @"class Program
  632. {
  633. void A()
  634. {
  635. }
  636. void B()
  637. {
  638. }
  639. }";
  640. await CheckAsync(initial, final);
  641. }
  642. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  643. [Fact]
  644. public async Task TestWhitespaceBetweenMethods2()
  645. {
  646. var initial =
  647. @"class Program
  648. {
  649. void B()
  650. {
  651. }
  652. void A()
  653. {
  654. }
  655. }";
  656. var final =
  657. @"class Program
  658. {
  659. void A()
  660. {
  661. }
  662. void B()
  663. {
  664. }
  665. }";
  666. await CheckAsync(initial, final);
  667. }
  668. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  669. [Fact]
  670. public async Task TestWhitespaceBetweenMethods3()
  671. {
  672. var initial =
  673. @"class Program
  674. {
  675. void B()
  676. {
  677. }
  678. void A()
  679. {
  680. }
  681. }";
  682. var final =
  683. @"class Program
  684. {
  685. void A()
  686. {
  687. }
  688. void B()
  689. {
  690. }
  691. }";
  692. await CheckAsync(initial, final);
  693. }
  694. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  695. [Fact]
  696. public async Task TestWhitespaceBetweenMethods4()
  697. {
  698. var initial =
  699. @"class Program
  700. {
  701. void B()
  702. {
  703. }
  704. void A()
  705. {
  706. }
  707. }";
  708. var final =
  709. @"class Program
  710. {
  711. void A()
  712. {
  713. }
  714. void B()
  715. {
  716. }
  717. }";
  718. await CheckAsync(initial, final);
  719. }
  720. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  721. [Fact]
  722. public async Task TestWhitespaceBetweenMethods5()
  723. {
  724. var initial =
  725. @"class Program
  726. {
  727. void B()
  728. {
  729. }
  730. void A()
  731. {
  732. }
  733. }";
  734. var final =
  735. @"class Program
  736. {
  737. void A()
  738. {
  739. }
  740. void B()
  741. {
  742. }
  743. }";
  744. await CheckAsync(initial, final);
  745. }
  746. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  747. [Fact]
  748. public async Task TestWhitespaceBetweenMethods6()
  749. {
  750. var initial =
  751. @"class Program
  752. {
  753. void B()
  754. {
  755. }
  756. void A()
  757. {
  758. }
  759. }";
  760. var final =
  761. @"class Program
  762. {
  763. void A()
  764. {
  765. }
  766. void B()
  767. {
  768. }
  769. }";
  770. await CheckAsync(initial, final);
  771. }
  772. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  773. [Fact]
  774. public async Task TestMoveComments1()
  775. {
  776. var initial =
  777. @"class Program
  778. {
  779. // B
  780. void B()
  781. {
  782. }
  783. void A()
  784. {
  785. }
  786. }";
  787. var final =
  788. @"class Program
  789. {
  790. void A()
  791. {
  792. }
  793. // B
  794. void B()
  795. {
  796. }
  797. }";
  798. await CheckAsync(initial, final);
  799. }
  800. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  801. [Fact]
  802. public async Task TestMoveComments2()
  803. {
  804. var initial =
  805. @"class Program
  806. {
  807. // B
  808. void B()
  809. {
  810. }
  811. // A
  812. void A()
  813. {
  814. }
  815. }";
  816. var final =
  817. @"class Program
  818. {
  819. // A
  820. void A()
  821. {
  822. }
  823. // B
  824. void B()
  825. {
  826. }
  827. }";
  828. await CheckAsync(initial, final);
  829. }
  830. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  831. [Fact]
  832. public async Task TestMoveDocComments1()
  833. {
  834. var initial =
  835. @"class Program
  836. {
  837. /// B
  838. void B()
  839. {
  840. }
  841. void A()
  842. {
  843. }
  844. }";
  845. var final =
  846. @"class Program
  847. {
  848. void A()
  849. {
  850. }
  851. /// B
  852. void B()
  853. {
  854. }
  855. }";
  856. await CheckAsync(initial, final);
  857. }
  858. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  859. [Fact]
  860. public async Task TestMoveDocComments2()
  861. {
  862. var initial =
  863. @"class Program
  864. {
  865. /// B
  866. void B()
  867. {
  868. }
  869. void A()
  870. {
  871. }
  872. }";
  873. var final =
  874. @"class Program
  875. {
  876. void A()
  877. {
  878. }
  879. /// B
  880. void B()
  881. {
  882. }
  883. }";
  884. await CheckAsync(initial, final);
  885. }
  886. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  887. [Fact]
  888. public async Task TestDontMoveBanner()
  889. {
  890. var initial =
  891. @"class Program
  892. {
  893. // Banner
  894. void B()
  895. {
  896. }
  897. void A()
  898. {
  899. }
  900. }";
  901. var final =
  902. @"class Program
  903. {
  904. // Banner
  905. void A()
  906. {
  907. }
  908. void B()
  909. {
  910. }
  911. }";
  912. await CheckAsync(initial, final);
  913. }
  914. [WorkItem(537614, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/537614")]
  915. [Fact]
  916. public async Task TestDontMoveBanner2()
  917. {
  918. var initial =
  919. @"class Program
  920. {
  921. // Banner
  922. // More banner
  923. // Bannery stuff
  924. void B()
  925. {
  926. }
  927. void A()
  928. {
  929. }
  930. }";
  931. var final =
  932. @"class Program
  933. {
  934. // Banner
  935. // More banner
  936. // Bannery stuff
  937. void A()
  938. {
  939. }
  940. void B()
  941. {
  942. }
  943. }";
  944. await CheckAsync(initial, final);
  945. }
  946. [WpfFact]
  947. [Trait(Traits.Feature, Traits.Features.Organizing)]
  948. [Trait(Traits.Feature, Traits.Features.Interactive)]
  949. public async Task OrganizingCommandsDisabledInSubmission()
  950. {
  951. var exportProvider = MinimalTestExportProvider.CreateExportProvider(
  952. TestExportProvider.EntireAssemblyCatalogWithCSharpAndVisualBasic.WithParts(typeof(InteractiveDocumentSupportsFeatureService)));
  953. using (var workspace = await TestWorkspace.CreateAsync(XElement.Parse(@"
  954. <Workspace>
  955. <Submission Language=""C#"" CommonReferences=""true"">
  956. class C
  957. {
  958. object $$foo;
  959. }
  960. </Submission>
  961. </Workspace> "),
  962. workspaceKind: WorkspaceKind.Interactive,
  963. exportProvider: exportProvider))
  964. {
  965. // Force initialization.
  966. workspace.GetOpenDocumentIds().Select(id => workspace.GetTestDocument(id).GetTextView()).ToList();
  967. var textView = workspace.Documents.Single().GetTextView();
  968. var handler = new OrganizeDocumentCommandHandler(workspace.GetService<Host.IWaitIndicator>());
  969. var delegatedToNext = false;
  970. Func<CommandState> nextHandler = () =>
  971. {
  972. delegatedToNext = true;
  973. return CommandState.Unavailable;
  974. };
  975. var state = handler.GetCommandState(new Commands.SortImportsCommandArgs(textView, textView.TextBuffer), nextHandler);
  976. Assert.True(delegatedToNext);
  977. Assert.False(state.IsAvailable);
  978. delegatedToNext = false;
  979. state = handler.GetCommandState(new Commands.SortAndRemoveUnnecessaryImportsCommandArgs(textView, textView.TextBuffer), nextHandler);
  980. Assert.True(delegatedToNext);
  981. Assert.False(state.IsAvailable);
  982. delegatedToNext = false;
  983. state = handler.GetCommandState(new Commands.RemoveUnnecessaryImportsCommandArgs(textView, textView.TextBuffer), nextHandler);
  984. Assert.True(delegatedToNext);
  985. Assert.False(state.IsAvailable);
  986. delegatedToNext = false;
  987. state = handler.GetCommandState(new Commands.OrganizeDocumentCommandArgs(textView, textView.TextBuffer), nextHandler);
  988. Assert.True(delegatedToNext);
  989. Assert.False(state.IsAvailable);
  990. }
  991. }
  992. }
  993. }