Slicer: Sort tree nodes to produce stable test data

This commit is contained in:
Alexey Sedunov
2018-02-05 16:11:03 +03:00
parent adca8eb7f1
commit c602c51642
31 changed files with 87 additions and 82 deletions
@@ -2,5 +2,5 @@
8 val x = <bold>a.foo()</bold>
4 fun <bold>foo() = 1</bold>
4 fun foo() = <bold>1</bold>
13 return <bold>4</bold>;
3 return <bold>2</bold>;
13 return <bold>4</bold>;
@@ -1,7 +1,7 @@
4 fun foo(n: Int, <bold>s: String = "???"</bold>) {
4 FunParamererWithDefaultKt.foo(1, <bold>"2"</bold>):
4 fun foo(n: Int, s: String = <bold>"???"</bold>) {
10 foo(1, <bold>"2"</bold>)
4 FunParamererWithDefaultKt.foo(1, <bold>"2"</bold>):
11 foo(1, s = <bold>"2"</bold>)
12 foo(n = 1, s = <bold>"2"</bold>)
13 foo(s = <bold>"2"</bold>, n = 1)
+1 -1
View File
@@ -1,5 +1,4 @@
5 fun <bold>bar(a: Int): Int = foo(a) { if (it > 0) it else return 0 }</bold>
5 fun bar(a: Int): Int = foo(a) { if (it > 0) it else return <bold>0</bold> }
5 fun bar(a: Int): Int = <bold>foo(a) { if (it > 0) it else return 0 }</bold>
3 inline fun <bold>foo(a: Int, f: (Int) -> Int) = f(a)</bold>
3 inline fun foo(a: Int, f: (Int) -> Int) = <bold>f(a)</bold>
@@ -9,3 +8,4 @@
5 fun bar(a: Int): Int = foo(a) <bold>{ if (it > 0) it else return 0 }</bold>
5 fun bar(a: Int): Int = foo(a) { <bold>if (it > 0) it else return 0</bold> }
5 fun bar(a: Int): Int = foo(a) { if (it > 0) <bold>it</bold> else return 0 }
5 fun bar(a: Int): Int = foo(a) { if (it > 0) it else return <bold>0</bold> }
@@ -6,13 +6,14 @@
7 else -> <bold>null</bold>
[NotNull Values]
6 n < 0 -> <bold>"-"</bold>
9 return <bold>s</bold>
4 var <bold>s = when {</bold>
4 var s = <bold>when {</bold>
6 n < 0 -> <bold>"-"</bold>
5 n > 0 -> <bold>"+"</bold>
9 return <bold>s</bold>
4 var <bold>s = when {</bold>
4 var s = <bold>when {</bold>
5 n > 0 -> <bold>"+"</bold>
6 n < 0 -> <bold>"-"</bold>
9 return <bold>s</bold>
4 var <bold>s = when {</bold>
4 var s = <bold>when {</bold>
6 n < 0 -> <bold>"-"</bold>
@@ -1,7 +1,7 @@
17 val <bold>y = b.foo()</bold>
17 val y = <bold>b.foo()</bold>
3 return <bold>5</bold>;
8 override fun <bold>foo() = 2</bold>
8 override fun foo() = <bold>2</bold>
3 return <bold>5</bold>;
12 override fun <bold>foo() = 3</bold>
12 override fun foo() = <bold>3</bold>
@@ -1,6 +1,6 @@
15 val <bold>y = b.foo</bold>
15 val y = <bold>b.foo</bold>
7 open class B(override val <bold>foo: Int</bold>) : A()
3 return <bold>5</bold>;
7 open class B(override val <bold>foo: Int</bold>) : A()
10 override val <bold>foo = 3</bold>
10 override val foo = <bold>3</bold>
@@ -1,7 +1,7 @@
20 val <bold>y = b.foo</bold>
20 val y = <bold>b.foo</bold>
3 return <bold>5</bold>;
9 override val <bold>foo: Int</bold>
10 get() = <bold>2</bold>
3 return <bold>5</bold>;
14 override val <bold>foo: Int</bold>
15 get() = <bold>3</bold>
@@ -1,7 +1,7 @@
17 val <bold>y = b.foo</bold>
17 val y = <bold>b.foo</bold>
3 return <bold>5</bold>;
8 override val <bold>foo = 2</bold>
8 override val foo = <bold>2</bold>
3 return <bold>5</bold>;
12 override val <bold>foo = 3</bold>
12 override val foo = <bold>3</bold>
@@ -1,17 +1,17 @@
3 open class A @JvmOverloads constructor(<bold>n: Int</bold>, s: String = "???")
3 super(<bold>n</bold>, s);
2 D(int <bold>n</bold>, String s) {
5 class B1: A(<bold>1</bold>)
7 super(<bold>n</bold>);
6 D(int <bold>n</bold>) {
6 class B2: A(<bold>1</bold>, "2")
7 class B3: A(<bold>1</bold>, s = "2")
11 new A(<bold>1</bold>);
8 class B4: A(n = <bold>1</bold>, s = "2")
12 new A(<bold>1</bold>, "2");
9 class B5: A(s = "2", n = <bold>1</bold>)
12 A(<bold>1</bold>)
13 A(<bold>1</bold>, "2")
14 A(<bold>1</bold>, s = "2")
15 A(n = <bold>1</bold>, s = "2")
16 A(s = "2", n = <bold>1</bold>)
3 super(<bold>n</bold>, s);
2 D(int <bold>n</bold>, String s) {
7 super(<bold>n</bold>);
6 D(int <bold>n</bold>) {
11 new A(<bold>1</bold>);
12 new A(<bold>1</bold>, "2");
@@ -1,13 +1,13 @@
3 open class A @JvmOverloads constructor(n: Int, <bold>s: String = "???"</bold>)
3 super(n, <bold>s</bold>);
2 D(int n, String <bold>s</bold>) {
3 open class A @JvmOverloads constructor(n: Int, s: String = <bold>"???"</bold>)
6 class B2: A(1, <bold>"2"</bold>)
7 class B3: A(1, s = <bold>"2"</bold>)
8 class B4: A(n = 1, s = <bold>"2"</bold>)
12 new A(1, <bold>"2"</bold>);
9 class B5: A(s = <bold>"2"</bold>, n = 1)
13 A(1, <bold>"2"</bold>)
14 A(1, s = <bold>"2"</bold>)
15 A(n = 1, s = <bold>"2"</bold>)
16 A(s = <bold>"2"</bold>, n = 1)
3 super(n, <bold>s</bold>);
2 D(int n, String <bold>s</bold>) {
12 new A(1, <bold>"2"</bold>);
@@ -1,17 +1,17 @@
4 @JvmOverloads constructor(<bold>n: Int</bold>, s: String = "???")
3 super(<bold>n</bold>, s);
2 D(int <bold>n</bold>, String s) {
7 class B1: A(<bold>1</bold>)
7 super(<bold>n</bold>);
6 D(int <bold>n</bold>) {
8 class B2: A(<bold>1</bold>, "2")
9 class B3: A(<bold>1</bold>, s = "2")
11 new A(<bold>1</bold>);
10 class B4: A(n = <bold>1</bold>, s = "2")
12 new A(<bold>1</bold>, "2");
11 class B5: A(s = "2", n = <bold>1</bold>)
14 A(<bold>1</bold>)
15 A(<bold>1</bold>, "2")
16 A(<bold>1</bold>, s = "2")
17 A(n = <bold>1</bold>, s = "2")
18 A(s = "2", n = <bold>1</bold>)
3 super(<bold>n</bold>, s);
2 D(int <bold>n</bold>, String s) {
7 super(<bold>n</bold>);
6 D(int <bold>n</bold>) {
11 new A(<bold>1</bold>);
12 new A(<bold>1</bold>, "2");
@@ -1,13 +1,13 @@
4 @JvmOverloads constructor(n: Int, <bold>s: String = "???"</bold>)
3 super(n, <bold>s</bold>);
2 D(int n, String <bold>s</bold>) {
4 @JvmOverloads constructor(n: Int, s: String = <bold>"???"</bold>)
8 class B2: A(1, <bold>"2"</bold>)
9 class B3: A(1, s = <bold>"2"</bold>)
12 new A(1, <bold>"2"</bold>);
10 class B4: A(n = 1, s = <bold>"2"</bold>)
11 class B5: A(s = <bold>"2"</bold>, n = 1)
15 A(1, <bold>"2"</bold>)
16 A(1, s = <bold>"2"</bold>)
17 A(n = 1, s = <bold>"2"</bold>)
18 A(s = <bold>"2"</bold>, n = 1)
3 super(n, <bold>s</bold>);
2 D(int n, String <bold>s</bold>) {
12 new A(1, <bold>"2"</bold>);
+1 -1
View File
@@ -1,4 +1,4 @@
3 var <bold>foo: Int = 1</bold>
3 var foo: Int = <bold>1</bold>
4 TopLevelVarKt.setFoo(<bold>3</bold>);
7 foo = <bold>2</bold>
4 TopLevelVarKt.setFoo(<bold>3</bold>);
+2 -2
View File
@@ -1,6 +1,6 @@
3 open class A(val <bold>n: Int</bold>)
5 class B : A(<bold>1</bold>)
8 val z = A(<bold>2</bold>).n
3 super(<bold>n</bold>);
2 D(int <bold>n</bold>) {
5 class B : A(<bold>1</bold>)
8 val z = A(<bold>2</bold>).n
7 A a = new A(<bold>3</bold>);
+3 -3
View File
@@ -1,10 +1,10 @@
3 open class A(var <bold>n: Int</bold>) {
20 class B : A(<bold>1</bold>)
23 val z = A(<bold>2</bold>).n
24 A(<bold>3</bold>).n = 2
3 super(<bold>n</bold>);
2 D(int <bold>n</bold>) {
7 A a = new A(<bold>3</bold>);
9 a.setN(<bold>4</bold>);
16 n = <bold>1</bold>
20 class B : A(<bold>1</bold>)
23 val z = A(<bold>2</bold>).n
24 A(<bold>3</bold>).n = 2
24 A(3).n = <bold>2</bold>
@@ -1,9 +1,9 @@
3 open class A<bold>()</bold> {
2 <bold>J() {</bold>
4 constructor(n: Int) : <bold>this()</bold>
7 <bold>super</bold>();
7 class B : <bold>A()</bold>
11 A a = new <bold>A</bold>();
10 constructor() : <bold>super()</bold>
14 val x = <bold>A()</bold>
14 val <bold>x = A()</bold>
2 <bold>J() {</bold>
7 <bold>super</bold>();
4 constructor(n: Int) : <bold>this()</bold>
10 constructor() : <bold>super()</bold>
11 A a = new <bold>A</bold>();
@@ -1,7 +1,5 @@
4 override fun foo() = <bold>4</bold>
4 override fun <bold>foo() = 4</bold>
11 val u = d.<bold>foo()</bold>
11 val <bold>u = d.foo()</bold>
2 public int <bold>foo();</bold>
8 val x = a.<bold>foo()</bold>
8 val <bold>x = a.foo()</bold>
@@ -9,14 +7,16 @@
9 val <bold>y = b.foo()</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
11 val u = d.<bold>foo()</bold>
11 val <bold>u = d.foo()</bold>
6 public int <bold>foo() {</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
8 DUPLICATE: val x = a.<bold>foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
10 DUPLICATE: val z = c.<bold>foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
12 public int <bold>foo();</bold>
10 DUPLICATE: val z = c.<bold>foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
8 DUPLICATE: val x = a.<bold>foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
10 DUPLICATE: val z = c.<bold>foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
@@ -1,12 +1,12 @@
4 override fun foo() = <bold>2</bold>
4 override fun <bold>foo() = 2</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
4 public int <bold>foo();</bold>
8 val x = a.<bold>foo()</bold>
8 val <bold>x = a.foo()</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
11 val u = d.<bold>foo()</bold>
11 val <bold>u = d.foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
@@ -1,12 +1,12 @@
4 override fun foo() = <bold>3</bold>
4 override fun <bold>foo() = 3</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
2 public int <bold>foo();</bold>
8 val x = a.<bold>foo()</bold>
8 val <bold>x = a.foo()</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
11 val u = d.<bold>foo()</bold>
11 val <bold>u = d.foo()</bold>
10 DUPLICATE: val z = c.<bold>foo()</bold>
10 DUPLICATE: val z = c.<bold>foo()</bold>
@@ -1,10 +1,10 @@
16 override fun foo() = <bold>4</bold>
16 override fun <bold>foo() = 4</bold>
23 val u = d.<bold>foo()</bold>
23 val <bold>u = d.foo()</bold>
20 val x = a.<bold>foo()</bold>
20 val <bold>x = a.foo()</bold>
21 val y = b.<bold>foo()</bold>
21 val <bold>y = b.foo()</bold>
22 val z = c.<bold>foo()</bold>
22 val <bold>z = c.foo()</bold>
23 val u = d.<bold>foo()</bold>
23 val <bold>u = d.foo()</bold>
@@ -1,6 +1,6 @@
8 override fun foo() = <bold>2</bold>
8 override fun <bold>foo() = 2</bold>
21 val y = b.<bold>foo()</bold>
21 val <bold>y = b.foo()</bold>
20 val x = a.<bold>foo()</bold>
20 val <bold>x = a.foo()</bold>
21 val y = b.<bold>foo()</bold>
21 val <bold>y = b.foo()</bold>
@@ -1,6 +1,6 @@
12 override fun foo() = <bold>3</bold>
12 override fun <bold>foo() = 3</bold>
22 val z = c.<bold>foo()</bold>
22 val <bold>z = c.foo()</bold>
20 val x = a.<bold>foo()</bold>
20 val <bold>x = a.foo()</bold>
22 val z = c.<bold>foo()</bold>
22 val <bold>z = c.foo()</bold>
@@ -1,6 +1,6 @@
8 override fun foo() = <bold>2</bold>
8 override fun <bold>foo() = 2</bold>
17 val y = b.<bold>foo()</bold>
17 val <bold>y = b.foo()</bold>
16 val x = a.<bold>foo()</bold>
16 val <bold>x = a.foo()</bold>
17 val y = b.<bold>foo()</bold>
17 val <bold>y = b.foo()</bold>
@@ -1,10 +1,10 @@
4 override fun foo() = <bold>2</bold>
4 override fun <bold>foo() = 2</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
2 int <bold>foo() {</bold>
8 val x = a.<bold>foo()</bold>
8 val <bold>x = a.foo()</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
@@ -1,8 +1,8 @@
10 override val foo = <bold>3</bold>
10 override val <bold>foo = 3</bold>
16 val z = c.<bold>foo</bold>
16 val <bold>z = c.foo</bold>
14 val x = a.<bold>foo</bold>
14 val <bold>x = a.foo</bold>
15 val y = b.<bold>foo</bold>
15 val <bold>y = b.foo</bold>
16 val z = c.<bold>foo</bold>
16 val <bold>z = c.foo</bold>
@@ -1,6 +1,6 @@
10 get() = <bold>2</bold>
10 <bold>get() = 2</bold>
20 val y = b.<bold>foo</bold>
20 val <bold>y = b.foo</bold>
19 val x = a.<bold>foo</bold>
19 val <bold>x = a.foo</bold>
20 val y = b.<bold>foo</bold>
20 val <bold>y = b.foo</bold>
@@ -1,6 +1,6 @@
8 override val foo = <bold>2</bold>
8 override val <bold>foo = 2</bold>
17 val y = b.<bold>foo</bold>
17 val <bold>y = b.foo</bold>
16 val x = a.<bold>foo</bold>
16 val <bold>x = a.foo</bold>
17 val y = b.<bold>foo</bold>
17 val <bold>y = b.foo</bold>
@@ -1,8 +1,8 @@
3 open class A<bold>(n: Int)</bold> {
7 class B : <bold>A(1)</bold>
14 val x = <bold>A(1)</bold>
14 val <bold>x = A(1)</bold>
3 <bold>super</bold>(1);
4 constructor() : <bold>this(1)</bold>
10 constructor() : <bold>super(1)</bold>
7 class B : <bold>A(1)</bold>
7 A a = new <bold>A</bold>(1);
10 constructor() : <bold>super(1)</bold>
14 val x = <bold>A(1)</bold>
14 val <bold>x = A(1)</bold>
@@ -1,8 +1,8 @@
4 <bold>constructor(n: Int)</bold>
9 class B : <bold>A(1)</bold>
16 val x = <bold>A(1)</bold>
16 val <bold>x = A(1)</bold>
3 <bold>super</bold>(1);
6 constructor() : <bold>this(1)</bold>
12 constructor() : <bold>super(1)</bold>
7 A a = new <bold>A</bold>(1);
9 class B : <bold>A(1)</bold>
12 constructor() : <bold>super(1)</bold>
16 val x = <bold>A(1)</bold>
16 val <bold>x = A(1)</bold>
@@ -1,7 +1,7 @@
3 val <bold>x = 1</bold>
3 int x = TopLevelPropertyUsagesKt.<bold>getX</bold>();
5 val y = <bold>x</bold>
5 val <bold>y = x</bold>
3 int x = TopLevelPropertyUsagesKt.<bold>getX</bold>();
8 val y = <bold>x</bold>
8 val <bold>y = x</bold>
13 z = <bold>x</bold>
@@ -27,6 +27,7 @@ import com.intellij.slicer.SliceRootNode
import com.intellij.usages.TextChunk
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.test.InTextDirectivesUtils
import org.jetbrains.kotlin.test.KotlinTestUtils
import java.awt.Font
@@ -46,6 +47,9 @@ abstract class AbstractSlicerTest : KotlinLightCodeInsightFixtureTestCase() {
}
companion object {
private val SliceNode.sortedChildren : List<SliceNode>
get() = children.sortedBy { it.value.element?.startOffset ?: -1 }
@JvmStatic
protected fun buildTreeRepresentation(rootNode: SliceNode): String {
fun TextChunk.render(): String {
@@ -67,7 +71,7 @@ abstract class AbstractSlicerTest : KotlinLightCodeInsightFixtureTestCase() {
return buildString {
when {
node is SliceRootNode && usage.element is KtFile -> {
node.children.forEach { append(process(it, indent)) }
node.sortedChildren.forEach { append(process(it, indent)) }
return@buildString
}
// SliceLeafValueClassNode is package-private
@@ -92,7 +96,7 @@ abstract class AbstractSlicerTest : KotlinLightCodeInsightFixtureTestCase() {
}
if (!isDuplicated) {
node.children.forEach { append(process(it, indent + 1)) }
node.sortedChildren.forEach { append(process(it, indent + 1)) }
}
}.replace(Regex("</bold><bold>"), "")
}