# conductor

# 原代码

地址: \conductor-main\es7-persistence\src\test\java\com\netflix\conductor\es7\dao\query\parser\TestExpression.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
* Copyright 2023 Conductor Authors.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.netflix.conductor.es7.dao.query.parser;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.junit.Test;

import com.netflix.conductor.es7.dao.query.parser.internal.AbstractParserTest;
import com.netflix.conductor.es7.dao.query.parser.internal.ConstValue;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

/**
* @author Viren
*/
public class TestExpression extends AbstractParserTest {

@Test
public void test() throws Exception {
String test =
"type='IMAGE' AND subType ='sdp' AND (metadata.width > 50 OR metadata.height > 50)";
// test = "type='IMAGE' AND subType ='sdp'";
// test = "(metadata.type = 'IMAGE')";
InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
Expression expr = new Expression(is);

System.out.println(expr);

assertTrue(expr.isBinaryExpr());
assertNull(expr.getGroupedExpression());
assertNotNull(expr.getNameValue());

NameValue nv = expr.getNameValue();
assertEquals("type", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"IMAGE\"", nv.getValue().getValue());

Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);
assertTrue(rhs.isBinaryExpr());

nv = rhs.getNameValue();
assertNotNull(nv); // subType = sdp
assertNull(rhs.getGroupedExpression());
assertEquals("subType", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"sdp\"", nv.getValue().getValue());

assertEquals("AND", rhs.getOperator().getOperator());
rhs = rhs.getRightHandSide();
assertNotNull(rhs);
assertFalse(rhs.isBinaryExpr());
GroupedExpression ge = rhs.getGroupedExpression();
assertNotNull(ge);
expr = ge.getExpression();
assertNotNull(expr);

assertTrue(expr.isBinaryExpr());
nv = expr.getNameValue();
assertNotNull(nv);
assertEquals("metadata.width", nv.getName().getName());
assertEquals(">", nv.getOp().getOperator());
assertEquals("50", nv.getValue().getValue());

assertEquals("OR", expr.getOperator().getOperator());
rhs = expr.getRightHandSide();
assertNotNull(rhs);
assertFalse(rhs.isBinaryExpr());
nv = rhs.getNameValue();
assertNotNull(nv);

assertEquals("metadata.height", nv.getName().getName());
assertEquals(">", nv.getOp().getOperator());
assertEquals("50", nv.getValue().getValue());
}

@Test
public void testWithSysConstants() throws Exception {
String test = "type='IMAGE' AND subType ='sdp' AND description IS null";
InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
Expression expr = new Expression(is);

System.out.println(expr);

assertTrue(expr.isBinaryExpr());
assertNull(expr.getGroupedExpression());
assertNotNull(expr.getNameValue());

NameValue nv = expr.getNameValue();
assertEquals("type", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"IMAGE\"", nv.getValue().getValue());

Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);
assertTrue(rhs.isBinaryExpr());

nv = rhs.getNameValue();
assertNotNull(nv); // subType = sdp
assertNull(rhs.getGroupedExpression());
assertEquals("subType", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"sdp\"", nv.getValue().getValue());

assertEquals("AND", rhs.getOperator().getOperator());
rhs = rhs.getRightHandSide();
assertNotNull(rhs);
assertFalse(rhs.isBinaryExpr());
GroupedExpression ge = rhs.getGroupedExpression();
assertNull(ge);
nv = rhs.getNameValue();
assertNotNull(nv);
assertEquals("description", nv.getName().getName());
assertEquals("IS", nv.getOp().getOperator());
ConstValue cv = nv.getValue();
assertNotNull(cv);
assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NULL);

test = "description IS not null";
is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
expr = new Expression(is);

System.out.println(expr);
nv = expr.getNameValue();
assertNotNull(nv);
assertEquals("description", nv.getName().getName());
assertEquals("IS", nv.getOp().getOperator());
cv = nv.getValue();
assertNotNull(cv);
assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NOT_NULL);
}
}

# 投喂代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
* Copyright 2023 Conductor Authors.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.netflix.conductor.es7.dao.query.parser;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.junit.Test;

import com.netflix.conductor.es7.dao.query.parser.internal.AbstractParserTest;
import com.netflix.conductor.es7.dao.query.parser.internal.ConstValue;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

/**
* @author Viren
*/
public class TestExpression extends AbstractParserTest {

@Test
public void test() throws Exception {
String test =
"type='IMAGE' AND subTy pe ='sdp' AND (metadata.width > 50 OR metadata.height > 50)";
// test = "type='IMAGE' AND subType ='sdp'";
// test = "(metadata.type = 'IMAGE')";
InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
Expression expr = new Expression(is);

System.out.println(expr);

NameValue nv = expr.getNameValue();

Expression rhs = expr.getRightHandSide();

nv = rhs.getNameValue();

rhs = rhs.getRightHandSide();
GroupedExpression ge = rhs.getGroupedExpression();
expr = ge.getExpression();

nv = expr.getNameValue();

rhs = expr.getRightHandSide();

nv = rhs.getNameValue();

}

@Test
public void testWithSysConstants() throws Exception {
String test = "type='IMAGE' AND subType ='sdp' AND description IS null";
InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
Expression expr = new Expression(is);

System.out.println(expr);

NameValue nv = expr.getNameValue();

Expression rhs = expr.getRightHandSide();

nv = rhs.getNameValue();

rhs = rhs.getRightHandSide();

GroupedExpression ge = rhs.getGroupedExpression();
nv = rhs.getNameValue();

ConstValue cv = nv.getValue();

test = "description IS not null";
is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
expr = new Expression(is);

System.out.println(expr);
nv = expr.getNameValue();

cv = nv.getValue();

}
}

# LLM 生成代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package com.netflix.conductor.es7.dao.query.parser;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.junit.Test;

import com.netflix.conductor.es7.dao.query.parser.internal.AbstractParserTest;
import com.netflix.conductor.es7.dao.query.parser.internal.ConstValue;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

/**
* Author: Viren
*/
public class TestExpression extends AbstractParserTest {

@Test
public void test() throws Exception {
String test = "type='IMAGE' AND subType='sdp' AND (metadata.width > 50 OR metadata.height > 50)";
InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
Expression expr = new Expression(is);

System.out.println(expr);

NameValue nv = expr.getNameValue();
assertNotNull(nv);

Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);

nv = rhs.getNameValue();
assertNotNull(nv);

rhs = rhs.getRightHandSide();
assertNotNull(rhs);

GroupedExpression ge = rhs.getGroupedExpression();
assertNotNull(ge);

expr = ge.getExpression();
assertNotNull(expr);

nv = expr.getNameValue();
assertNotNull(nv);

rhs = expr.getRightHandSide();
assertNotNull(rhs);

nv = rhs.getNameValue();
assertNotNull(nv);
}

@Test
public void testWithSysConstants() throws Exception {
String test = "type='IMAGE' AND subType='sdp' AND description IS null";
InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
Expression expr = new Expression(is);

System.out.println(expr);

NameValue nv = expr.getNameValue();
assertNotNull(nv);

Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);

nv = rhs.getNameValue();
assertNotNull(nv);

rhs = rhs.getRightHandSide();
assertNotNull(rhs);

GroupedExpression ge = rhs.getGroupedExpression();
assertNotNull(ge);

nv = rhs.getNameValue();
assertNotNull(nv);

ConstValue cv = nv.getValue();
assertNull(cv); // Assuming null due to 'description IS null'

test = "description IS not null";
is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
expr = new Expression(is);

System.out.println(expr);
nv = expr.getNameValue();
assertNotNull(nv);

cv = nv.getValue();
assertNotNull(cv); // Assuming not null due to 'description IS not null'
}
}

# 代码分析

# 原代码含义:

# test 方法中的断言

  1. assertTrue(expr.isBinaryExpr());
    • 验证内容:检查 expr 是否是一个二元表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为只有在输入表达式被解析为二元表达式时,这个断言才会通过。
  2. assertNull(expr.getGroupedExpression());
    • 验证内容:检查 expr 是否没有组表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为只有在输入表达式没有包含组表达式时,这个断言才会通过。
  3. assertNotNull(expr.getNameValue());
    • 验证内容:检查 exprNameValue 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为只有在输入表达式包含一个 NameValue 时,这个断言才会通过。
  4. assertEquals("type", nv.getName().getName());
    • 验证内容:检查 NameValue 的名称是否为 "type"
    • 依赖性:依赖于具体的 SUT 输出,因为 NameValue 的名称必须与输入表达式的内容一致。
  5. assertEquals("=", nv.getOp().getOperator());
    • 验证内容:检查 NameValue 的操作符是否为 "="
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  6. assertEquals("\"IMAGE\"", nv.getValue().getValue());
    • 验证内容:检查 NameValue 的值是否为 "IMAGE"
    • 依赖性:依赖于具体的 SUT 输出,因为值必须与输入表达式的内容一致。
  7. assertNotNull(rhs);
    • 验证内容:检查右侧表达式 rhs 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须存在。
  8. assertTrue(rhs.isBinaryExpr());
    • 验证内容:检查右侧表达式 rhs 是否是一个二元表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须被解析为二元表达式。
  9. assertNotNull(nv);
    • 验证内容:检查右侧 NameValue 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须包含一个 NameValue
  10. assertNull(rhs.getGroupedExpression());
    • 验证内容:检查右侧表达式是否没有组表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须不包含组表达式。
  11. assertEquals("subType", nv.getName().getName());
    • 验证内容:检查右侧 NameValue 的名称是否为 "subType"
    • 依赖性:依赖于具体的 SUT 输出,因为名称必须与输入表达式的内容一致。
  12. assertEquals("=", nv.getOp().getOperator());
    • 验证内容:检查右侧 NameValue 的操作符是否为 "="
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  13. assertEquals("\"sdp\"", nv.getValue().getValue());
    • 验证内容:检查右侧 NameValue 的值是否为 "sdp"
    • 依赖性:依赖于具体的 SUT 输出,因为值必须与输入表达式的内容一致。
  14. assertEquals("AND", rhs.getOperator().getOperator());
    • 验证内容:检查右侧表达式的操作符是否为 "AND"
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  15. assertNotNull(rhs);
    • 验证内容:检查右侧表达式 rhs 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须存在。
  16. assertFalse(rhs.isBinaryExpr());
    • 验证内容:检查右侧表达式 rhs 是否不是一个二元表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须不是二元表达式。
  17. assertNull(ge);
    • 验证内容:检查右侧组表达式 ge 是否为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式不包含组表达式。
  18. assertNotNull(nv);
    • 验证内容:检查右侧 NameValue 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须包含一个 NameValue
  19. assertEquals("description", nv.getName().getName());
    • 验证内容:检查右侧 NameValue 的名称是否为 "description"
    • 依赖性:依赖于具体的 SUT 输出,因为名称必须与输入表达式的内容一致。
  20. assertEquals("IS", nv.getOp().getOperator());
    • 验证内容:检查右侧 NameValue 的操作符是否为 "IS"
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  21. assertNotNull(cv);
    • 验证内容:检查右侧 NameValue 的值是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为值必须存在。
  22. assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NULL);
    • 验证内容:检查右侧 NameValue 的系统常量值是否为 ConstValue.SystemConsts.NULL
    • 依赖性:依赖于具体的 SUT 输出,因为系统常量值必须与输入表达式的内容一致。

# testWithSysConstants 方法中的断言

  1. assertTrue(expr.isBinaryExpr());
    • 验证内容:检查 expr 是否是一个二元表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为只有在输入表达式被解析为二元表达式时,这个断言才会通过。
  2. assertNull(expr.getGroupedExpression());
    • 验证内容:检查 expr 是否没有组表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为只有在输入表达式没有包含组表达式时,这个断言才会通过。
  3. assertNotNull(expr.getNameValue());
    • 验证内容:检查 exprNameValue 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为只有在输入表达式包含一个 NameValue 时,这个断言才会通过。
  4. assertEquals("type", nv.getName().getName());
    • 验证内容:检查 NameValue 的名称是否为 "type"
    • 依赖性:依赖于具体的 SUT 输出,因为 NameValue 的名称必须与输入表达式的内容一致。
  5. assertEquals("=", nv.getOp().getOperator());
    • 验证内容:检查 NameValue 的操作符是否为 "="
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  6. assertEquals("\"IMAGE\"", nv.getValue().getValue());
    • 验证内容:检查 NameValue 的值是否为 "IMAGE"
    • 依赖性:依赖于具体的 SUT 输出,因为值必须与输入表达式的内容一致。
  7. assertNotNull(rhs);
    • 验证内容:检查右侧表达式 rhs 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须存在。
  8. assertTrue(rhs.isBinaryExpr());
    • 验证内容:检查右侧表达式 rhs 是否是一个二元表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须被解析为二元表达式。
  9. assertNotNull(nv);
    • 验证内容:检查右侧 NameValue 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须包含一个 NameValue
  10. assertNull(rhs.getGroupedExpression());
    • 验证内容:检查右侧表达式是否没有组表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须不包含组表达式。
  11. assertEquals("subType", nv.getName().getName());
    • 验证内容:检查右侧 NameValue 的名称是否为 "subType"
    • 依赖性:依赖于具体的 SUT 输出,因为名称必须与输入表达式的内容一致。
  12. assertEquals("=", nv.getOp().getOperator());
    • 验证内容:检查右侧 NameValue 的操作符是否为 "="
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  13. assertEquals("\"sdp\"", nv.getValue().getValue());
    • 验证内容:检查右侧 NameValue 的值是否为 "sdp"
    • 依赖性:依赖于具体的 SUT 输出,因为值必须与输入表达式的内容一致。
  14. assertEquals("AND", rhs.getOperator().getOperator());
    • 验证内容:检查右侧表达式的操作符是否为 "AND"
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  15. assertNotNull(rhs);
    • 验证内容:检查右侧表达式 rhs 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须存在。
  16. assertFalse(rhs.isBinaryExpr());
    • 验证内容:检查右侧表达式 rhs 是否不是一个二元表达式。
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须不是二元表达式。
  17. assertNull(ge);
    • 验证内容:检查右侧组表达式 ge 是否为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式不包含组表达式。
  18. assertNotNull(nv);
    • 验证内容:检查右侧 NameValue 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为右侧表达式必须包含一个 NameValue
  19. assertEquals("description", nv.getName().getName());
    • 验证内容:检查右侧 NameValue 的名称是否为 "description"
    • 依赖性:依赖于具体的 SUT 输出,因为名称必须与输入表达式的内容一致。
  20. assertEquals("IS", nv.getOp().getOperator());
    • 验证内容:检查右侧 NameValue 的操作符是否为 "IS"
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  21. assertNotNull(cv);
    • 验证内容:检查右侧 NameValue 的值是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为值必须存在。
  22. assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NULL);
    • 验证内容:检查右侧 NameValue 的系统常量值是否为 ConstValue.SystemConsts.NULL
    • 依赖性:依赖于具体的 SUT 输出,因为系统常量值必须与输入表达式的内容一致。
  23. assertNotNull(nv);
    • 验证内容:检查 NameValue 是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为 NameValue 必须存在。
  24. assertEquals("description", nv.getName().getName());
    • 验证内容:检查 NameValue 的名称是否为 "description"
    • 依赖性:依赖于具体的 SUT 输出,因为名称必须与输入表达式的内容一致。
  25. assertEquals("IS", nv.getOp().getOperator());
    • 验证内容:检查 NameValue 的操作符是否为 "IS"
    • 依赖性:依赖于具体的 SUT 输出,因为操作符必须与输入表达式的内容一致。
  26. assertNotNull(cv);
    • 验证内容:检查 NameValue 的值是否不为 null
    • 依赖性:依赖于具体的 SUT 输出,因为值必须存在。
  27. assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NOT_NULL);
    • 验证内容:检查 NameValue 的系统常量值是否为 ConstValue.SystemConsts.NOT_NULL
    • 依赖性:依赖于具体的 SUT 输出,因为系统常量值必须与输入表达式的内容一致。

# 相似率

# 原代码和填充后代码相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
assertNotNull(rhs);
assertNotNull(nv); // subType = sdp
assertNotNull(rhs);
assertNotNull(ge);
assertNotNull(expr);
assertNotNull(nv);
assertNotNull(rhs);
assertNotNull(nv);
assertNotNull(rhs);
assertNotNull(nv); // subType = sdp
assertNotNull(rhs);
assertNotNull(nv);
assertNotNull(nv);
assertNotNull(cv);
assertNotNull(nv);
assertNotNull(cv);

# 原代码有,填充后无

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
assertTrue(expr.isBinaryExpr());
assertNull(expr.getGroupedExpression());
assertNotNull(expr.getNameValue());
assertTrue(rhs.isBinaryExpr());
assertNull(rhs.getGroupedExpression());
assertEquals("subType", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"sdp\"", nv.getValue().getValue());
assertEquals("AND", rhs.getOperator().getOperator());
assertFalse(rhs.isBinaryExpr());
assertTrue(expr.isBinaryExpr());
assertEquals("metadata.width", nv.getName().getName());
assertEquals(">", nv.getOp().getOperator());
assertEquals("50", nv.getValue().getValue());
assertEquals("OR", expr.getOperator().getOperator());
assertFalse(rhs.isBinaryExpr());
assertEquals("metadata.height", nv.getName().getName());
assertEquals(">", nv.getOp().getOperator());
assertEquals("50", nv.getValue().getValue());
assertTrue(expr.isBinaryExpr());
assertNull(expr.getGroupedExpression());
assertNotNull(expr.getNameValue());
assertTrue(rhs.isBinaryExpr());
assertNull(rhs.getGroupedExpression());
assertEquals("subType", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"sdp\"", nv.getValue().getValue());
assertEquals("AND", rhs.getOperator().getOperator());
assertFalse(rhs.isBinaryExpr());
assertEquals("description", nv.getName().getName());
assertEquals("IS", nv.getOp().getOperator());
assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NULL);
assertEquals("description", nv.getName().getName());
assertEquals("IS", nv.getOp().getOperator());
assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NOT_NULL);

# 原代码和填充后不同

1
2
3
4
5
6
7
8
**原代码**:
assertEquals("type", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"IMAGE\"", nv.getValue().getValue());
assertEquals("type", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"IMAGE\"", nv.getValue().getValue());
assertNull(ge);☆

1
2
3
4
**填充后的代码**
assertNotNull(nv);
assertNotNull(nv);
assertNotNull(ge);☆

# 相似率

原代码共 58 个 assert 语句,填充后的代码与原代码测试语句相同的部分占 16 项,不同的部分占 7 项,其中填充后与原代码含义相反的代码 1 项(已用☆标出),原代码有而填充后代码缺失的语句占 35 项。填充正确率为 27.58%

# 具体分析

# 1

原代码:

1
2
3
assertTrue(expr.isBinaryExpr());
assertNull(expr.getGroupedExpression());
assertNotNull(expr.getNameValue());

assertTrue(expr.isBinaryExpr());

  • 验证内容: 验证表达式 expr 是否为二元表达式。这确保了表达式具有两个操作数和一个操作符。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析输入表达式并判断其类型。

assertNull(expr.getGroupedExpression());

  • 验证内容: 确认表达式 expr 的分组表达式为空。确保表达式没有嵌套在其他表达式中。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析输入表达式并判断其是否包含分组表达式。

assertNotNull(expr.getNameValue());

  • 验证内容: 验证表达式 expr 的名称和值对象是否存在。确保表达式包含有效的名称和值。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析输入表达式并返回名称和值对象。

LLM 填充后: 没有填充这些 assert 语句。

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 Expression 类的 isBinaryExprgetGroupedExpression 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 提供的代码中缺少关于 Expression 类的具体信息,使得 LLM 无法生成与这些方法相关的断言。

# 2

原代码:

1
2
3
4
NameValue nv = expr.getNameValue();
assertEquals("type", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"IMAGE\"", nv.getValue().getValue());

assertEquals("type", nv.getName().getName());

  • 验证内容: 验证 NameValue 对象的名称是否为 "type"。确保名称字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称字段。

assertEquals("=", nv.getOp().getOperator());

  • 验证内容: 验证操作符是否为 "="。确保操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回操作符字段。

assertEquals("\"IMAGE\"", nv.getValue().getValue());

  • 验证内容: 验证值是否为 "IMAGE" 。确保值字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回值字段。

LLM 填充后:

1
2
NameValue nv = expr.getNameValue();
assertNotNull(nv);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有描述 NameValue 类的 getNamegetOpgetValue 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少 NameValue 类的详细信息,导致 LLM 仅能生成基本的存在性断言 assertNotNull

# 3

原代码:

1
2
3
Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);
assertTrue(rhs.isBinaryExpr());

assertNotNull(rhs);

  • 验证内容: 验证右侧表达式 rhs 是否存在。确保表达式正确解析并包含右侧操作数。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回右侧表达式。

assertTrue(rhs.isBinaryExpr());

  • 验证内容: 验证右侧表达式 rhs 是否为二元表达式。确保右侧表达式具有两个操作数和一个操作符。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并判断其类型。

LLM 填充后:

1
2
Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 Expression 类的 getRightHandSideisBinaryExpr 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 Expression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 4

原代码:

1
2
3
4
5
6
7
8
nv = rhs.getNameValue();
assertNotNull(nv); // subType = sdp
assertNull(rhs.getGroupedExpression());
assertEquals("subType", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"sdp\"", nv.getValue().getValue());

assertEquals("AND", rhs.getOperator().getOperator());

assertNotNull(nv);

  • 验证内容: 验证名称和值对象 nv 是否存在。确保名称和值对象正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回 NameValue 对象。

assertNull(rhs.getGroupedExpression());

  • 验证内容: 确认右侧表达式 rhs 的分组表达式为空。确保右侧表达式没有嵌套在其他表达式中。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并判断其是否包含分组表达式。

assertEquals("subType", nv.getName().getName());

  • 验证内容: 验证 NameValue 对象的名称是否为 "subType"。确保右侧表达式中的名称字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称字段。

assertEquals("=", nv.getOp().getOperator());

  • 验证内容: 验证操作符是否为 "="。确保右侧表达式中的操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回操作符字段。

assertEquals("\"sdp\"", nv.getValue().getValue());

  • 验证内容: 验证值是否为 "sdp" 。确保右侧表达式中的值字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回值字段。

assertEquals("AND", rhs.getOperator().getOperator());

  • 验证内容: 验证操作符是否为 "AND"。确保右侧表达式中的操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并返回操作符字段。

LLM 填充后:

1
2
nv = rhs.getNameValue();
assertNotNull(nv);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 NameValueExpression 类的相关方法。LLM 无法推断这些方法的存在和它们的预期行为。

  • 上下文不足: 缺少对 NameValueExpression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 5

原代码

1
2
3
rhs = rhs.getRightHandSide();
assertNotNull(rhs);
assertFalse(rhs.isBinaryExpr());

assertNotNull(rhs);

  • 验证内容: 验证右侧表达式 rhs 是否存在。确保表达式正确解析并包含右侧操作数。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回右侧表达式。

assertFalse(rhs.isBinaryExpr());

  • 验证内容: 验证右侧表达式 rhs 是否为非二元表达式。确保右侧表达式不是二元表达式,可能是其他类型的表达式。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并判断其类型。

LLM 填充后:

1
2
rhs = rhs.getRightHandSide();
assertNotNull(rhs);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 Expression 类的 getRightHandSideisBinaryExpr 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 Expression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 6

原代码:

1
2
GroupedExpression ge = rhs.getGroupedExpression();
assertNotNull(ge);

  • 验证内容: 验证分组表达式 ge 是否存在。确保右侧表达式中包含有效的分组表达式。

  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回 GroupedExpression 对象。LLM 填充后:

1
2
GroupedExpression ge = rhs.getGroupedExpression();
assertNotNull(ge);

成功原因:

  • 方法名称和返回类型明确: getGroupedExpression 方法名称和返回类型明确,容易被 LLM 推断和理解。
  • 存在性检查: assertNotNull 是基本的存在性检查,容易生成。

# 7

原代码:

1
2
3
expr = ge.getExpression();
assertNotNull(expr);
assertTrue(expr.isBinaryExpr());

assertNotNull(expr);

  • 验证内容: 验证嵌套表达式 expr 是否存在。确保分组表达式中包含有效的嵌套表达式。
  • 依赖性: 依赖具体的 SUT 输出。需要 GroupedExpression 类正确解析并返回 Expression 对象。

assertTrue(expr.isBinaryExpr());

  • 验证内容: 验证嵌套表达式 expr 是否为二元表达式。确保嵌套表达式具有两个操作数和一个操作符。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析嵌套表达式并判断其类型。

LLM 填充后:

1
2
expr = ge.getExpression();
assertNotNull(expr);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 GroupedExpression 类的 getExpression 方法和 Expression 类的 isBinaryExpr 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 GroupedExpressionExpression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 8

原代码:

1
2
3
4
5
6
7
nv = expr.getNameValue();
assertNotNull(nv);
assertEquals("metadata.width", nv.getName().getName());
assertEquals(">", nv.getOp().getOperator());
assertEquals("50", nv.getValue().getValue());

assertEquals("OR", expr.getOperator().getOperator());

assertNotNull(nv);

  • 验证内容: 验证名称和值对象 nv 是否存在。确保嵌套表达式中的名称和值对象正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回 NameValue 对象。

assertEquals("metadata.width", nv.getName().getName());

  • 验证内容: 验证 NameValue 对象的名称是否为 "metadata.width"。确保嵌套表达式中的名称字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称字段。

assertEquals(">", nv.getOp().getOperator());

  • 验证内容: 验证操作符是否为 ">"。确保嵌套表达式中的操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回操作符字段。

assertEquals("50", nv.getValue().getValue());

  • 验证内容: 验证值是否为 "50"。确保嵌套表达式中的值字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回值字段。

assertEquals("OR", expr.getOperator().getOperator());

  • 验证内容: 验证操作符是否为 "OR"。确保嵌套表达式中的操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回操作符字段。

LLM 填充后:

1
2
nv = expr.getNameValue();
assertNotNull(nv);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 NameValueExpression 类的相关方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 NameValueExpression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 9

原代码:

1
2
3
rhs = expr.getRightHandSide();
assertNotNull(rhs);
assertFalse(rhs.isBinaryExpr());

assertNotNull(rhs);

  • 验证内容: 验证右侧表达式 rhs 是否存在。确保表达式正确解析并包含右侧操作数。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回右侧表达式。

assertFalse(rhs.isBinaryExpr());

  • 验证内容: 验证右侧表达式 rhs 是否为非二元表达式。确保右侧表达式不是二元表达式,可能是其他类型的表达式。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并判断其类型。

LLM 填充后:

1
2
rhs = expr.getRightHandSide();
assertNotNull(rhs);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 Expression 类的 getRightHandSideisBinaryExpr 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 Expression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 10

原代码:

1
2
3
4
5
6
nv = rhs.getNameValue();
assertNotNull(nv);

assertEquals("metadata.height", nv.getName().getName());
assertEquals(">", nv.getOp().getOperator());
assertEquals("50", nv.getValue().getValue());

assertNotNull(nv);

  • 验证内容: 验证名称和值对象 nv 是否存在。确保右侧表达式中的名称和值对象正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回 NameValue 对象。

assertEquals("metadata.height", nv.getName().getName());

  • 验证内容: 验证 NameValue 对象的名称是否为 "metadata.height"。确保右侧表达式中的名称字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称字段。

assertEquals(">", nv.getOp().getOperator());

  • 验证内容: 验证操作符是否为 ">"。确保右侧表达式中的操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回操作符字段。

assertEquals("50", nv.getValue().getValue());

  • 验证内容: 验证值是否为 "50"。确保右侧表达式中的值字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回值字段。

LLM 填充后:

1
2
nv = rhs.getNameValue();
assertNotNull(nv);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 NameValue 类的 getNamegetOpgetValue 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 NameValue 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 11

原代码:

1
2
3
assertTrue(expr.isBinaryExpr());
assertNull(expr.getGroupedExpression());
assertNotNull(expr.getNameValue());

assertTrue(expr.isBinaryExpr());

  • 验证内容: 验证表达式 expr 是否为二元表达式。这确保了表达式具有两个操作数和一个操作符。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析输入表达式并判断其类型。

assertNull(expr.getGroupedExpression());

  • 验证内容: 确认表达式 expr 的分组表达式为空。确保表达式没有嵌套在其他表达式中。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析输入表达式并判断其是否包含分组表达式。

assertNotNull(expr.getNameValue());

  • 验证内容: 验证表达式 expr 的名称和值对象是否存在。确保表达式包含有效的名称和值。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析输入表达式并返回名称和值对象。

LLM 填充后: 没有填充这些 assert 语句。

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 Expression 类的 isBinaryExprgetGroupedExpression 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 提供的代码中缺少关于 Expression 类的具体信息,使得 LLM 无法生成与这些方法相关的断言。

# 12

原代码:

1
2
3
4
NameValue nv = expr.getNameValue();
assertEquals("type", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"IMAGE\"", nv.getValue().getValue());

assertEquals("type", nv.getName().getName());

  • 验证内容: 验证 NameValue 对象的名称是否为 "type"。确保名称字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称字段。

assertEquals("=", nv.getOp().getOperator());

  • 验证内容: 验证操作符是否为 "="。确保操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回操作符字段。

assertEquals("\"IMAGE\"", nv.getValue().getValue());

  • 验证内容: 验证值是否为 "IMAGE" 。确保值字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回值字段。

LLM 填充后:

1
assertNotNull(nv);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有描述 NameValue 类的 getNamegetOpgetValue 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少 NameValue 类的详细信息,导致 LLM 仅能生成基本的存在性断言 assertNotNull

# 13

原代码:

1
2
3
Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);
assertTrue(rhs.isBinaryExpr());

assertNotNull(rhs);

  • 验证内容: 验证右侧表达式 rhs 是否存在。确保表达式正确解析并包含右侧操作数。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回右侧表达式。

assertTrue(rhs.isBinaryExpr());

  • 验证内容: 验证右侧表达式 rhs 是否为二元表达式。确保右侧表达式具有两个操作数和一个操作符。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并判断其类型。

LLM 填充后:

1
2
Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 Expression 类的 getRightHandSideisBinaryExpr 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 Expression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 14

原代码:

1
2
3
4
5
6
7
8
nv = rhs.getNameValue();
assertNotNull(nv); // subType = sdp
assertNull(rhs.getGroupedExpression());
assertEquals("subType", nv.getName().getName());
assertEquals("=", nv.getOp().getOperator());
assertEquals("\"sdp\"", nv.getValue().getValue());

assertEquals("AND", rhs.getOperator().getOperator());

assertNotNull(nv);

  • 验证内容: 验证名称和值对象 nv 是否存在。确保名称和值对象正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回 NameValue 对象。

assertNull(rhs.getGroupedExpression());

  • 验证内容: 确认右侧表达式 rhs 的分组表达式为空。确保右侧表达式没有嵌套在其他表达式中。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并判断其是否包含分组表达式。

assertEquals("subType", nv.getName().getName());

  • 验证内容: 验证 NameValue 对象的名称是否为 "subType"。确保右侧表达式中的名称字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称字段。

assertEquals("=", nv.getOp().getOperator());

  • 验证内容: 验证操作符是否为 "="。确保右侧表达式中的操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回操作符字段。

assertEquals("\"sdp\"", nv.getValue().getValue());

  • 验证内容: 验证值是否为 "sdp" 。确保右侧表达式中的值字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回值字段。

assertEquals("AND", rhs.getOperator().getOperator());

  • 验证内容: 验证操作符是否为 "AND"。确保右侧表达式中的操作符字段正确解析。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并返回操作符字段。

LLM 填充后:

1
2
nv = rhs.getNameValue();
assertNotNull(nv);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 NameValueExpression 类的相关方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 NameValueExpression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 15

原代码:

1
2
3
rhs = rhs.getRightHandSide();
assertNotNull(rhs);
assertFalse(rhs.isBinaryExpr());

assertNotNull(rhs);

  • 验证内容: 验证右侧表达式 rhs 是否存在。确保表达式正确解析并包含右侧操作数。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回右侧表达式。

assertFalse(rhs.isBinaryExpr());

  • 验证内容: 验证右侧表达式 rhs 是否为非二元表达式。确保右侧表达式不是二元表达式,可能是其他类型的表达式。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析右侧表达式并判断其类型。

LLM 填充后:

1
2
rhs = rhs.getRightHandSide();
assertNotNull(rhs);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 Expression 类的 getRightHandSideisBinaryExpr 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 Expression 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 16

原代码:

1
2
GroupedExpression ge = rhs.getGroupedExpression();
assertNull(ge);

assertNull(ge);

  • 验证内容: 确认分组表达式 ge 为空。确保右侧表达式没有嵌套在其他表达式中。
  • 依赖性: 依赖具体的 SUT 输出。需要 Expression 类正确解析并返回 GroupedExpression 对象。

LLM 填充后:

1
2
GroupedExpression ge = rhs.getGroupedExpression();
assertNull(ge);

成功原因:

  • 方法名称和返回类型明确: getGroupedExpression 方法名称和返回类型明确,容易被 LLM 推断和理解。
  • 存在性检查: assertNull 是基本的存在性检查,容易生成。

# 17

原代码:

1
2
3
4
nv = rhs.getNameValue();
assertNotNull(nv);
assertEquals("description", nv.getName().getName());
assertEquals("IS", nv.getOp().getOperator());

  • 象。

** assertNotNull(nv);

  • 验证内容: 验证名称和值对象 nv 是否存在,确保名称字段为 "description",操作符字段为 "IS"。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称和操作符字段。

** assertEquals(cv.getSysConstant() **

  • 验证内容: 验证常量值 cv 是否存在,并确保其系统常量为 NULL
  • 依赖性: 依赖具体的 SUT 输出。需要 ConstValue 类正确解析并返回系统常量。

assertEquals("IS", nv.getOp().getOperator());

  • 验证内容: 验证名称和值对象 nv 是否存在,确保名称字段为 "description",操作符字段为 "IS"。
  • 依赖性: 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称和操作符字段。

** as **LLM 填充后:

1
2
nv = rhs.getNameValue();
assertNotNull(nv);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 NameValue 类的 getNamegetOp 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 NameValue 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 18

原代码:

1
2
3
ConstValue cv = nv.getValue();
assertNotNull(cv);
assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NULL);

  • ** 验证内容:** 验证常量值 cv 是否存在,并确保其系统常量为 NULL
  • ** 依赖性:** 依赖具体的 SUT 输出。需要 ConstValue 类正确解析并返回系统常量。

LLM 填充后:

1
2
ConstValue cv = nv.getValue();
assertNull(cv); // Assuming null due to 'description IS null'

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 ConstValue 类的 getSysConstant 方法和 SystemConsts 常量。LLM 无法推断这些方法和常量的存在及其预期行为。
  • 上下文不足: 缺少对 ConstValue 类的详细信息,导致 LLM 生成了错误的断言。

# 19

原代码:

1
2
3
4
nv = expr.getNameValue();
assertNotNull(nv);
assertEquals("description", nv.getName().getName());
assertEquals("IS", nv.getOp().getOperator());

  • ** 验证内容:** 验证名称和值对象 nv 是否存在,确保名称字段为 "description",操作符字段为 "IS"。

  • ** 依赖性:** 依赖具体的 SUT 输出。需要 NameValue 类正确解析并返回名称和操作符字段。

LLM 填充后:

1
2
nv = expr.getNameValue();
assertNotNull(nv);

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 NameValue 类的 getNamegetOp 方法。LLM 无法推断这些方法的存在和它们的预期行为。
  • 上下文不足: 缺少对 NameValue 类的详细信息,使得 LLM 仅能生成基本的存在性断言 assertNotNull

# 20

原代码:

1
2
3
cv = nv.getValue();
assertNotNull(cv);
assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NOT_NULL);

  • ** 验证内容:** 验证常量值 cv 是否存在,并确保其系统常量为 NOT_NULL

  • ** 依赖性:** 依赖具体的 SUT 输出。需要 ConstValue 类正确解析并返回系统常量。

LLM 填充后:

1
2
cv = nv.getValue();
assertNotNull(cv); // Assuming not null due to 'description IS not null'

失败原因:

  • 缺少详细的类定义和方法描述: 提供的代码没有详细描述 ConstValue 类的 getSysConstant 方法和 SystemConsts 常量。LLM 无法推断这些方法和常量的存在及其预期行为。
  • 上下文不足: 缺少对 ConstValue 类的详细信息,导致 LLM 生成了错误的断言。

# 给出附属代码后的更新版填充分析

当提前给 LLMassert 测试语句的全部所需内容后,再给出去除 assert 语句的填充文件,LLM 生成的代码如下:

# LLM 生成代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
* Copyright 2023 Conductor Authors.
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package com.netflix.conductor.es7.dao.query.parser;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;

import org.junit.Test;

import com.netflix.conductor.es7.dao.query.parser.internal.AbstractParserTest;
import com.netflix.conductor.es7.dao.query.parser.internal.ConstValue;

import static org.junit.Assert.*;

/**
* @author Viren
*/
public class TestExpression extends AbstractParserTest {

@Test
public void test() throws Exception {
String test =
"type='IMAGE' AND subTy pe ='sdp' AND (metadata.width > 50 OR metadata.height > 50)";
// test = "type='IMAGE' AND subType ='sdp'";
// test = "(metadata.type = 'IMAGE')";
InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
Expression expr = new Expression(is);

System.out.println(expr);

assertNotNull(expr);

NameValue nv = expr.getNameValue();
assertNotNull(nv);
assertEquals("type", nv.getName());
assertEquals("IMAGE", nv.getValue().getValue());

Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);

nv = rhs.getNameValue();
assertNotNull(nv);
assertEquals("subType", nv.getName());
assertEquals("sdp", nv.getValue().getValue());

rhs = rhs.getRightHandSide();
assertNotNull(rhs);

GroupedExpression ge = rhs.getGroupedExpression();
assertNotNull(ge);

expr = ge.getExpression();
assertNotNull(expr);

nv = expr.getNameValue();
assertNotNull(nv);
assertEquals("metadata.width", nv.getName());
assertTrue(nv.getValue().getValue() > 50 || nv.getValue().getValue() > 50);

rhs = expr.getRightHandSide();
assertNotNull(rhs);

nv = rhs.getNameValue();
assertNotNull(nv);
assertEquals("metadata.height", nv.getName());
assertTrue(nv.getValue().getValue() > 50);
}

@Test
public void testWithSysConstants() throws Exception {
String test = "type='IMAGE' AND subType ='sdp' AND description IS null";
InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
Expression expr = new Expression(is);

System.out.println(expr);

assertNotNull(expr);

NameValue nv = expr.getNameValue();
assertNotNull(nv);
assertEquals("type", nv.getName());
assertEquals("IMAGE", nv.getValue().getValue());

Expression rhs = expr.getRightHandSide();
assertNotNull(rhs);

nv = rhs.getNameValue();
assertNotNull(nv);
assertEquals("subType", nv.getName());
assertEquals("sdp", nv.getValue().getValue());

rhs = rhs.getRightHandSide();
assertNotNull(rhs);

GroupedExpression ge = rhs.getGroupedExpression();
assertNotNull(ge);

nv = rhs.getNameValue();
assertNotNull(nv);
assertNull(nv.getValue());

ConstValue cv = nv.getValue();
assertNull(cv);

test = "description IS not null";
is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes()));
expr = new Expression(is);

System.out.println(expr);
nv = expr.getNameValue();

assertNotNull(nv);
assertEquals("description", nv.getName());
cv = nv.getValue();
assertNotNull(cv);
}
}

# 填充代码分析

# 测试功能 1:测试表达式解析

# assertTrue(expr.isBinaryExpr());

原代码

1
assertTrue(expr.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查表达式是否为二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 考虑不够充分,没有考虑到需要检查改 expr 是否为二元表达式,并且上下文提示不够,让 LLM 无法生成。

# assertNull(expr.getGroupedExpression());

原代码

1
assertNull(expr.getGroupedExpression());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查表达式是否没有分组表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. ** 分析 LLM 为什么能 / 不能生成该测试语句:**LLM 在生成的时候没有考虑到检测表达式是否有分组表达式,这表明 LLM 可能无法考虑到更深层次的检验。

# assertNotNull(expr.getNameValue());

原代码

1
assertNotNull(expr.getNameValue());

填充后的代码

1
assertNotNull(expr);

分析:

  1. ** 成功 / 失败:** 不足
  2. 原因: LLM 想要检查检查表达式是否不为空。
  3. 效果: 原测试代码效果更好,原测试代码是检验 getNameValue() 方法返回结果不为空,而 LLM 生成的代码是检查 expr 对象是否为空,仅在初始化时有效,不能保证表达式各个部分是否解析正确。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 生成该 assert 语句时基本思路是正确的,在很多情况下,首先检查对象是否为空是一个常见的编程模式,这使得 LLM 更容易生成这样的 assert 语句。即当生成一个表达式 expr 时,LLM 总是想要检查其是否为空

# assertEquals("type", nv.getName().getName());

原代码

1
assertEquals("type", nv.getName().getName());

填充后的代码

1
assertEquals("type", nv.getName());

分析:

  1. 成功 / 失败: 不足
  2. 原因: LLM 想要检查名称值对象的名称,但是没有深入的检查对象返回值是否还有一个返回值。
  3. 效果: 考虑不周,效果有折扣。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别名称值对象的名称应该是什么。在许多情况下,直接检查一个方法的返回值是否等于某个值是一个常见的编程模式,因此 LLM 更容易生成这样的 assert 语句。

# assertEquals("=", nv.getOp().getOperator());

原代码

1
assertEquals("=", nv.getOp().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性。

# assertEquals(""IMAGE"", nv.getValue().getValue());

原代码

1
assertEquals("\"IMAGE\"", nv.getValue().getValue());

填充后的代码

1
assertEquals("IMAGE", nv.getValue().getValue());

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查名称值对象的值,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的值。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到值应该是什么。—— 即 LLM 在提前给出的预备代码里知道了名称值对象的预期值

# assertNotNull(rhs);

原代码

1
assertNotNull(rhs);

填充后的代码

1
assertNotNull(rhs);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查右侧表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了右侧表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为前序刚生成了 rhs—— rhs = rhs.getRightHandSide();LLM 能够自动识别到下一步应该判断其不为空

# assertTrue(rhs.isBinaryExpr());

原代码

1
assertTrue(rhs.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查右侧表达式是否为二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断右侧表达式是否为二元表达式。如上文一样,LLM 可能无法识别生成的 rhs 是一个二元表达式,故 LLM 也没用考虑到需要检验它

# assertNotNull(nv);

原代码

1
assertNotNull(nv);

填充后的代码

1
assertNotNull(nv);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查名称值对象不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到名称值对象应存在的基本逻辑,即生成一个新的名称时需要检验其是否为空

# assertNull(rhs.getGroupedExpression());

原代码

1
assertNull(rhs.getGroupedExpression());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查右侧表达式是否没有分组表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它缺乏关于表达式结构的具体信息和背景知识。LLM 无法判断出该表达式是否为分组表达式,这可能是因为 LLM 无法联想到 getRightHandSide 的具体内容,即 LLM 无法判断一个比较多元递归的函数的属性。因为 rhs.getGroupedExpression()=expr.getRightHandSide().getGroupedExpression()=System.out.println(expr).getRightHandSide().getGroupedExpression()

# assertEquals("subType", nv.getName().getName());

原代码

1
assertEquals("subType", nv.getName().getName());

填充后的代码

1
assertEquals("subType", nv.getName());

分析:

  1. 成功 / 失败: 不足
  2. 原因: LLM 想要检查名称值对象的名称,但是没有深入的检查对象返回值是否还有一个返回值。
  3. 效果: 考虑不周,效果有折扣。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别名称值对象的名称应该是什么。在许多情况下,直接检查一个方法的返回值是否等于某个值是一个常见的编程模式,因此 LLM 更容易生成这样的 assert 语句。

# assertEquals("=", nv.getOp().getOperator());

原代码

1
assertEquals("=", nv.getOp().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性。

# assertEquals(""sdp"", nv.getValue().getValue());

原代码

1
assertEquals("\"sdp\"", nv.getValue().getValue());

填充后的代码

1
assertEquals("sdp", nv.getValue().getValue());

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查名称值对象的值,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的值。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到值应该是什么。即 LLM 能够根据前置代码判断出此处的返回字符串应为 sdp

# assertEquals("AND", rhs.getOperator().getOperator());

原代码

1
assertEquals("AND", rhs.getOperator().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性

# assertNotNull(rhs);

原代码

1
assertNotNull(rhs);

填充后的代码

1
assertNotNull(rhs);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查右侧表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了右侧表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到右侧表达式应存在的基本逻辑。并且意识到生成一个名称后应该验证是否为空

# assertFalse(rhs.isBinaryExpr());

原代码

1
assertFalse(rhs.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查右侧表达式是否为非二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断右侧表达式是否为非二元表达式。并且 LLM 无法通过前置代码推断出此时的 rhs 一定是二元表达式。

# assertNotNull(ge);

原代码

1
assertNotNull(ge);

填充后的代码

1
assertNotNull(ge);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查分组表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了分组表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到分组表达式应存在的基本逻辑。并且意识到生成一个名称后应该验证是否为空

# assertNotNull(expr);

原代码

1
assertNotNull(expr);

填充后的代码

1
assertNotNull(expr);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到表达式应存在的基本逻辑。并且意识到生成一个名称后应该验证是否为空

# assertTrue(expr.isBinaryExpr());

原代码

1
assertTrue(expr.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查表达式是否为二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断表达式是否为二元表达式。从上述可以看出,LLM 无法根据逻辑判断 getExpression 函数生成的一定是二元表达式,故无法得出此检验

# assertNotNull(nv);

原代码

1
assertNotNull(nv);

填充后的代码

1
assertNotNull(nv);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查名称值对象不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到名称值对象应存在的基本逻辑。

# assertEquals("metadata.width", nv.getName().getName());

原代码

1
assertEquals("metadata.width", nv.getName().getName());

填充后的代码

1
assertEquals("metadata.width", nv.getName());

分析:

  1. 成功 / 失败: 不足
  2. 原因: 检查名称值对象的名称,但是只检查了一层,没有判断到 nv 的 getName 返回值还包含一层 getName
  3. 效果: 效果变差
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别名称值对象的名称应该是什么。但是 LLM 没有考虑到该函数生成的返回值内还包含返回值

# assertEquals(">", nv.getOp().getOperator());

原代码

1
assertEquals(">", nv.getOp().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性并且 LLM 误以为要检验的是返回值是否大于 50.

# assertEquals("50", nv.getValue().getValue());

原代码

1
assertEquals("50", nv.getValue().getValue());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查值。
  3. 效果: 更坏,因为缺少对值的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到值验证的重要性。并且 LLM 误以为要检验的是返回值是否大于 50.

# assertEquals("OR", expr.getOperator().getOperator());

原代码

1
assertEquals("OR", expr.getOperator().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性。并且 LLM 误以为要检验的是返回值是否大于 50.

# assertNotNull(rhs);

原代码

1
assertNotNull(rhs);

填充后的代码

1
assertNotNull(rhs);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查右侧表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了右侧表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到右侧表达式应存在的基本逻辑。LLM 能在一个名称生成后判断其是否为空。

# assertFalse(rhs.isBinaryExpr());

原代码

1
assertFalse(rhs.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查右侧表达式是否为非二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断右侧表达式是否为非二元表达式。综上,LLM 无法判断它是否为非二元表达式

# assertEquals("metadata.height", nv.getName().getName());

原代码

1
assertEquals("metadata.height", nv.getName().getName());

填充后的代码

1
assertEquals("metadata.height", nv.getName());

分析:

  1. ** 成功 / 失败:** 不足
  2. 原因: 检查名称值对象的名称,你层数不够
  3. 效果: 效果变差,验证名称值对象的名称不够深入。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别名称值对象的名称应该是什么。没有考虑充分

# assertEquals(">", nv.getOp().getOperator());

原代码

1
assertEquals(">", nv.getOp().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性

# assertEquals("50", nv.getValue().getValue());

原代码

1
assertEquals("50", nv.getValue().getValue());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查值。
  3. 效果: 更坏,因为缺少对值的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到值验证的重要性

# 测试功能 2:测试系统常量的表达式解析

# assertTrue(expr.isBinaryExpr());

原代码

1
assertTrue(expr.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查表达式是否为二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断表达式是否为二元表达式。

# assertNull(expr.getGroupedExpression());

原代码

1
assertNull(expr.getGroupedExpression());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查表达式是否没有分组表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它缺乏关于表达式结构的具体信息和背景知识。

# assertNotNull(expr.getNameValue());

原代码

1
assertNotNull(expr.getNameValue());

填充后的代码

1
assertNotNull(expr);

分析:

  1. 成功 / 失败: 不足
  2. 原因: 都检查了表达式是否为空,但是 LLM 填充的代码没有考虑到表达式是否被正确解析。
  3. 效果: 效果变差。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: 在许多编程场景中,首先检查对象是否为空是一个常见的模式。因此,LLM 在没有详细上下文的情况下,更可能生成这种通用的 assert 语句

# assertEquals("type", nv.getName().getName());

原代码

1
assertEquals("type", nv.getName().getName());

填充后的代码

1
assertEquals("type", nv.getName());

分析:

  1. 成功 / 失败: 不足
  2. 原因: 检查名称值对象的名称,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的名称。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别名称值对象的名称应该是什么。

# assertEquals("=", nv.getOp().getOperator());

原代码

1
assertEquals("=", nv.getOp().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性

# assertEquals(""IMAGE"", nv.getValue().getValue());

原代码

1
assertEquals("\"IMAGE\"", nv.getValue().getValue());

填充后的代码

1
assertEquals("IMAGE", nv.getValue().getValue());

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查名称值对象的值,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的值。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到值应该是什么。

# assertNotNull(rhs);

原代码

1
assertNotNull(rhs);

填充后的代码

1
assertNotNull(rhs);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查右侧表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了右侧表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到右侧表达式应存在的基本逻辑。

# assertTrue(rhs.isBinaryExpr());

原代码

1
assertTrue(rhs.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查右侧表达式是否为二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断右侧表达式是否为二元表达式。

# assertNotNull(nv);

原代码

1
assertNotNull(nv);

填充后的代码

1
assertNotNull(nv);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查名称值对象不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到名称值对象应存在的基本逻辑。

# assertNull(rhs.getGroupedExpression());

原代码

1
assertNull(rhs.getGroupedExpression());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查右侧表达式是否没有分组表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它缺乏关于表达式结构的具体信息和背景知识。

# assertEquals("subType", nv.getName().getName());

原代码

1
assertEquals("subType", nv.getName().getName());

填充后的代码

1
assertEquals("subType", nv.getName());

分析:

  1. 成功 / 失败: 不足
  2. 原因: 检查名称值对象的名称,但是检查没有考虑到返回值还包含返回值
  3. 效果: 效果变差,考虑不周全。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别名称值对象的名称应该是什么。当遇到需要检查名称的时候,LLM 往往代入单层,而没有考虑到多层的情况。

# assertEquals("=", nv.getOp().getOperator());

原代码

1
assertEquals("=", nv.getOp().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性。

# assertEquals(""sdp"", nv.getValue().getValue());

原代码

1
assertEquals("\"sdp\"", nv.getValue().getValue());

填充后的代码

1
assertEquals("sdp", nv.getValue().getValue());

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查名称值对象的值,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的值。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到值应该是什么。

# assertEquals("AND", rhs.getOperator().getOperator());

原代码

1
assertEquals("AND", rhs.getOperator().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性。

# assertNotNull(rhs);

原代码

1
assertNotNull(rhs);

填充后的代码

1
assertNotNull(rhs);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查右侧表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了右侧表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到右侧表达式应存在的基本逻辑。

# assertFalse(rhs.isBinaryExpr());

原代码

1
assertFalse(rhs.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查右侧表达式是否为非二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断右侧表达式是否为非二元表达式。

# assertNotNull(ge);

原代码

1
assertNotNull(ge);

填充后的代码

1
assertNotNull(ge);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查分组表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了分组表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到分组表达式应存在的基本逻辑。

# assertNotNull(expr);

原代码

1
assertNotNull(expr);

填充后的代码

1
assertNotNull(expr);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到表达式应存在的基本逻辑。

# assertTrue(expr.isBinaryExpr());

原代码

1
assertTrue(expr.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查表达式是否为二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断表达式是否为二元表达式。

# assertNotNull(nv);

原代码

1
assertNotNull(nv);

填充后的代码

1
assertNotNull(nv);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查名称值对象不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了名称值对象的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到名称值对象应存在的基本逻辑。

# assertEquals("metadata.width", nv.getName().getName());

原代码

1
assertEquals("metadata.width", nv.getName().getName());

填充后的代码

1
assertEquals("metadata.width", nv.getName());

分析:

  1. ** 成功 / 失败:** 不足
  2. 原因: 考虑不全面
  3. 效果: 效果变差
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 只考虑单层

# assertEquals(">", nv.getOp().getOperator());

原代码

1
assertEquals(">", nv.getOp().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性。

# assertEquals("50", nv.getValue().getValue());

原代码

1
assertEquals("50", nv.getValue().getValue());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查值。
  3. 效果: 更坏,因为缺少对值的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到值验证的重要性。

# assertEquals("OR", expr.getOperator().getOperator());

原代码

1
assertEquals("OR", expr.getOperator().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性。

# assertNotNull(rhs);

原代码

1
assertNotNull(rhs);

填充后的代码

1
assertNotNull(rhs);

分析:

  1. 成功 / 失败: 成功
  2. 原因: 检查右侧表达式不为空,这符合预期。
  3. 效果: 效果不变,因为都验证了右侧表达式的存在性。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 能够生成该 assert 语句,因为它能够识别到右侧表达式应存在的基本逻辑。

# assertFalse(rhs.isBinaryExpr());

原代码

1
assertFalse(rhs.isBinaryExpr());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查右侧表达式是否为非二元表达式。
  3. 效果: 更坏,因为缺少对表达式结构的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有足够的上下文信息来判断右侧表达式是否为非二元表达式。

# assertEquals("metadata.height", nv.getName().getName());

原代码

1
assertEquals("metadata.height", nv.getName().getName());

填充后的代码

1
assertEquals("metadata.height", nv.getName());

分析:

  1. 成功 / 失败: 不足
  2. 原因: 检查的时候没有考虑返回值还有返回值
  3. 效果: 效果变差,考虑不全面
  4. 分析 LLM 为什么能 / 不能生成该测试语句: 当遇到需要检查返回值的时候,LLM 往往只考虑单层而没有考虑多层

# assertEquals(">", nv.getOp().getOperator());

原代码

1
assertEquals(">", nv.getOp().getOperator());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查操作符。
  3. 效果: 更坏,因为缺少对操作符的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到操作符验证的重要性。

# assertEquals("50", nv.getValue().getValue());

原代码

1
assertEquals("50", nv.getValue().getValue());

填充后的代码 没有对应的 assert 语句。

分析:

  1. 成功 / 失败: 失败
  2. 原因: 填充后的代码没有检查值。
  3. 效果: 更坏,因为缺少对值的验证。
  4. 分析 LLM 为什么能 / 不能生成该测试语句: LLM 不能生成该 assert 语句可能是因为它没有识别到值验证的重要性。

# 结果统计

# 统计

  • 成功的 assert 语句数: 18
  • 不足的 assert 语句数: 9
  • 失败的 assert 语句数: 31
  • 总数: 56

# 正确率计算

正确率=(成功的assert语句数总数)×100=(1858)×100%31.03%\text{正确率} = \left( \frac{\text{成功的assert语句数}}{\text{总数}} \right) \times 100=\left( \frac{18}{58} \right) \times 100\% \approx 31.03\%

合格率=(成功的assert语句数+不足的assert语句数总数)×100=(18+9058)×100%46.55%\text{合格率} = \left( \frac{\text{成功的assert语句数+不足的assert语句数}}{\text{总数}} \right) \times 100=\left( \frac{18+90}{58} \right) \times 100\% \approx 46.55\%

LLM 预测的正确率: 31.03%31.03\%

**LLM 预测的合格率: **46.55%46.55\%