Skip to content

Commit 0251473

Browse files
DavideDSanne
authored andcommitted
HHH-13759 Additional test cases
1 parent 0dea831 commit 0251473

File tree

2 files changed

+372
-0
lines changed

2 files changed

+372
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.bytecode.enhance.internal.bytebuddy;
8+
9+
import java.lang.reflect.Method;
10+
import javax.persistence.Column;
11+
import javax.persistence.Embeddable;
12+
import javax.persistence.Embedded;
13+
import javax.persistence.Entity;
14+
import javax.persistence.Id;
15+
import javax.persistence.MappedSuperclass;
16+
17+
import org.hibernate.bytecode.enhance.internal.tracker.CompositeOwnerTracker;
18+
import org.hibernate.bytecode.enhance.internal.tracker.SimpleFieldTracker;
19+
20+
import org.hibernate.testing.TestForIssue;
21+
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
22+
import org.hibernate.testing.bytecode.enhancement.EnhancementOptions;
23+
import org.junit.Test;
24+
import org.junit.runner.RunWith;
25+
26+
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.ENTITY_ENTRY_FIELD_NAME;
28+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.ENTITY_ENTRY_GETTER_NAME;
29+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.ENTITY_INSTANCE_GETTER_NAME;
30+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.NEXT_FIELD_NAME;
31+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.NEXT_GETTER_NAME;
32+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.NEXT_SETTER_NAME;
33+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX;
34+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PERSISTENT_FIELD_WRITER_PREFIX;
35+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PREVIOUS_FIELD_NAME;
36+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PREVIOUS_GETTER_NAME;
37+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PREVIOUS_SETTER_NAME;
38+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_CLEAR_NAME;
39+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_COMPOSITE_CLEAR_OWNER;
40+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_COMPOSITE_FIELD_NAME;
41+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_COMPOSITE_SET_OWNER;
42+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_FIELD_NAME;
43+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_GET_NAME;
44+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_HAS_CHANGED_NAME;
45+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_SUSPEND_NAME;
46+
47+
@TestForIssue(jiraKey = "HHH-13759")
48+
@RunWith(BytecodeEnhancerRunner.class)
49+
@EnhancementOptions(inlineDirtyChecking = true)
50+
public class DirtyCheckingWithEmbeddableAndMappedSuperclassTest {
51+
52+
@Test
53+
public void shouldDeclareFieldsInEntityClass() {
54+
assertThat( CardGame.class )
55+
.hasDeclaredFields( ENTITY_ENTRY_FIELD_NAME, PREVIOUS_FIELD_NAME, NEXT_FIELD_NAME, TRACKER_FIELD_NAME );
56+
}
57+
58+
@Test
59+
public void shouldDeclareMethodsInEntityClass() {
60+
assertThat( CardGame.class )
61+
.hasDeclaredMethods( PERSISTENT_FIELD_READER_PREFIX + "id", PERSISTENT_FIELD_WRITER_PREFIX + "id" )
62+
.hasDeclaredMethods( PERSISTENT_FIELD_READER_PREFIX + "name", PERSISTENT_FIELD_WRITER_PREFIX + "name" )
63+
.hasDeclaredMethods( ENTITY_INSTANCE_GETTER_NAME, ENTITY_ENTRY_GETTER_NAME )
64+
.hasDeclaredMethods( PREVIOUS_GETTER_NAME, PREVIOUS_SETTER_NAME, NEXT_GETTER_NAME, NEXT_SETTER_NAME )
65+
.hasDeclaredMethods( TRACKER_HAS_CHANGED_NAME, TRACKER_CLEAR_NAME, TRACKER_SUSPEND_NAME, TRACKER_GET_NAME );
66+
}
67+
68+
@Test
69+
public void shouldDeclareFieldsInEmbeddedClass() {
70+
assertThat( Component.class )
71+
.hasDeclaredFields( TRACKER_COMPOSITE_FIELD_NAME );
72+
}
73+
74+
@Test
75+
public void shouldDeclareMethodsInEmbeddedClass() {
76+
assertThat(Component.class )
77+
.hasDeclaredMethods( PERSISTENT_FIELD_READER_PREFIX + "component", PERSISTENT_FIELD_WRITER_PREFIX + "component" )
78+
.hasDeclaredMethods( TRACKER_COMPOSITE_SET_OWNER, TRACKER_COMPOSITE_CLEAR_OWNER );
79+
}
80+
81+
@Test
82+
public void shouldCreateTheTracker() throws Exception {
83+
CardGame entity = new CardGame( "MTG", "Magic the Gathering" );
84+
assertThat( entity )
85+
.extracting( NEXT_FIELD_NAME ).isNull();
86+
assertThat( entity )
87+
.extracting( PREVIOUS_FIELD_NAME ).isNull();
88+
assertThat( entity )
89+
.extracting( ENTITY_ENTRY_FIELD_NAME ).isNull();
90+
assertThat( entity )
91+
.extracting( TRACKER_FIELD_NAME ).isInstanceOf( SimpleFieldTracker.class );
92+
assertThat( entity.getFirstPlayerToken() )
93+
.extracting( TRACKER_COMPOSITE_FIELD_NAME ).isInstanceOf( CompositeOwnerTracker.class);
94+
95+
assertThat( entity ).extracting( TRACKER_HAS_CHANGED_NAME ).isEqualTo( true );
96+
assertThat( entity ).extracting( TRACKER_GET_NAME )
97+
.isEqualTo( new String[] { "name", "firstPlayerToken" } );
98+
assertThat( entity.getFirstPlayerToken() )
99+
.extracting( TRACKER_COMPOSITE_FIELD_NAME + ".names" ).isEqualTo( new String[] { "firstPlayerToken" } );
100+
}
101+
102+
@Test
103+
public void shouldResetTheTracker() throws Exception {
104+
CardGame entity = new CardGame( "7WD", "7 Wonders duel" );
105+
106+
Method trackerClearMethod = CardGame.class.getMethod( TRACKER_CLEAR_NAME );
107+
trackerClearMethod.invoke( entity );
108+
109+
assertThat( entity ).extracting( TRACKER_HAS_CHANGED_NAME ).isEqualTo( false );
110+
assertThat( entity ).extracting( TRACKER_GET_NAME ).isEqualTo( new String[0] );
111+
}
112+
113+
@Test
114+
public void shouldUpdateTheTracker() throws Exception {
115+
CardGame entity = new CardGame( "SPL", "Splendor" );
116+
117+
Method trackerClearMethod = CardGame.class.getMethod( TRACKER_CLEAR_NAME );
118+
trackerClearMethod.invoke( entity );
119+
120+
entity.setName( "Splendor: Cities of Splendor" );
121+
122+
assertThat( entity ).extracting( TRACKER_HAS_CHANGED_NAME ).isEqualTo( true );
123+
assertThat( entity ).extracting( TRACKER_GET_NAME )
124+
.isEqualTo( new String[] { "name", "firstPlayerToken" } );
125+
126+
trackerClearMethod.invoke( entity );
127+
128+
entity.setFirstPlayerToken( new Component( "FIRST PLAYER!!!!!!!!" ) );
129+
assertThat( entity ).extracting( TRACKER_GET_NAME )
130+
.isEqualTo( new String[] { "firstPlayerToken" } );
131+
assertThat( entity.getFirstPlayerToken() )
132+
.extracting( TRACKER_COMPOSITE_FIELD_NAME + ".names" ).isEqualTo( new String[] { "firstPlayerToken" } );
133+
}
134+
135+
@MappedSuperclass
136+
public static abstract class TableTopGame {
137+
138+
@Embedded
139+
private Component firstPlayerToken;
140+
141+
public Component getFirstPlayerToken() {
142+
return firstPlayerToken;
143+
}
144+
145+
public void setFirstPlayerToken(Component firstPlayerToken) {
146+
this.firstPlayerToken = firstPlayerToken;
147+
}
148+
}
149+
150+
@Embeddable
151+
public static class Component {
152+
153+
@Column(name = "first_player_token")
154+
private String component;
155+
156+
public Component() {
157+
}
158+
159+
private Component(String component) {
160+
this.component = component;
161+
}
162+
163+
public String getComponent() {
164+
return component;
165+
}
166+
167+
public void setComponent(String component) {
168+
this.component = component;
169+
}
170+
}
171+
172+
@Entity(name = "CardGame")
173+
public static class CardGame extends TableTopGame {
174+
175+
@Id
176+
private String id;
177+
private String name;
178+
179+
public CardGame() {
180+
}
181+
182+
private CardGame(String id, String name) {
183+
this.id = id;
184+
this.name = name;
185+
setFirstPlayerToken( createEmbeddedValue( name ) );
186+
}
187+
188+
public String getId() {
189+
return id;
190+
}
191+
192+
public void setId(String id) {
193+
this.id = id;
194+
}
195+
196+
public String getName() {
197+
return name;
198+
}
199+
200+
public void setName(String name) {
201+
this.name = name;
202+
setFirstPlayerToken( createEmbeddedValue( name ) );
203+
}
204+
205+
private Component createEmbeddedValue(String name) {
206+
return new Component( name + " first player token");
207+
}
208+
}
209+
210+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.bytecode.enhance.internal.bytebuddy;
8+
9+
import java.lang.reflect.Method;
10+
import javax.persistence.Entity;
11+
import javax.persistence.Id;
12+
import javax.persistence.MappedSuperclass;
13+
14+
import org.hibernate.bytecode.enhance.internal.tracker.SimpleFieldTracker;
15+
16+
import org.hibernate.testing.TestForIssue;
17+
import org.hibernate.testing.bytecode.enhancement.BytecodeEnhancerRunner;
18+
import org.hibernate.testing.bytecode.enhancement.EnhancementOptions;
19+
import org.junit.Test;
20+
import org.junit.runner.RunWith;
21+
22+
import static org.assertj.core.api.Assertions.assertThat;
23+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.ENTITY_ENTRY_FIELD_NAME;
24+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.ENTITY_ENTRY_GETTER_NAME;
25+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.ENTITY_INSTANCE_GETTER_NAME;
26+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.NEXT_FIELD_NAME;
27+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.NEXT_GETTER_NAME;
28+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.NEXT_SETTER_NAME;
29+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PERSISTENT_FIELD_READER_PREFIX;
30+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PERSISTENT_FIELD_WRITER_PREFIX;
31+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PREVIOUS_FIELD_NAME;
32+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PREVIOUS_GETTER_NAME;
33+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.PREVIOUS_SETTER_NAME;
34+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_CLEAR_NAME;
35+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_FIELD_NAME;
36+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_GET_NAME;
37+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_HAS_CHANGED_NAME;
38+
import static org.hibernate.bytecode.enhance.spi.EnhancerConstants.TRACKER_SUSPEND_NAME;
39+
40+
@TestForIssue(jiraKey = "HHH-13759")
41+
@RunWith(BytecodeEnhancerRunner.class)
42+
@EnhancementOptions(inlineDirtyChecking = true)
43+
public class DirtyCheckingWithMappedsuperclassTest {
44+
45+
@Test
46+
public void shouldDeclareFieldsInEntityClass() {
47+
assertThat( CardGame.class )
48+
.hasDeclaredFields( ENTITY_ENTRY_FIELD_NAME, PREVIOUS_FIELD_NAME, NEXT_FIELD_NAME, TRACKER_FIELD_NAME );
49+
}
50+
51+
@Test
52+
public void shouldDeclareMethodsInEntityClass() {
53+
assertThat( CardGame.class )
54+
.hasDeclaredMethods( PERSISTENT_FIELD_READER_PREFIX + "id", PERSISTENT_FIELD_WRITER_PREFIX + "id" )
55+
.hasDeclaredMethods( PERSISTENT_FIELD_READER_PREFIX + "name", PERSISTENT_FIELD_WRITER_PREFIX + "name" )
56+
.hasDeclaredMethods( PERSISTENT_FIELD_READER_PREFIX + "code", PERSISTENT_FIELD_WRITER_PREFIX + "code" )
57+
.hasDeclaredMethods( ENTITY_INSTANCE_GETTER_NAME, ENTITY_ENTRY_GETTER_NAME )
58+
.hasDeclaredMethods( PREVIOUS_GETTER_NAME, PREVIOUS_SETTER_NAME, NEXT_GETTER_NAME, NEXT_SETTER_NAME )
59+
.hasDeclaredMethods( TRACKER_HAS_CHANGED_NAME, TRACKER_CLEAR_NAME, TRACKER_SUSPEND_NAME, TRACKER_GET_NAME );
60+
}
61+
62+
@Test
63+
public void shouldCreateTheTracker() throws Exception {
64+
CardGame entity = new CardGame( "MTG", "Magic the Gathering" );
65+
assertThat( entity )
66+
.extracting( NEXT_FIELD_NAME ).isNull();
67+
assertThat( entity )
68+
.extracting( PREVIOUS_FIELD_NAME ).isNull();
69+
assertThat( entity )
70+
.extracting( ENTITY_ENTRY_FIELD_NAME ).isNull();
71+
assertThat( entity )
72+
.extracting( TRACKER_FIELD_NAME ).isInstanceOf( SimpleFieldTracker.class );
73+
74+
assertThat( entity ).extracting( TRACKER_HAS_CHANGED_NAME ).isEqualTo( true );
75+
assertThat( entity ).extracting( TRACKER_GET_NAME ).isEqualTo( new String[] { "name", "code" } );
76+
}
77+
78+
@Test
79+
public void shouldResetTheTracker() throws Exception {
80+
CardGame entity = new CardGame( "7WD", "7 Wonders duel" );
81+
82+
Method trackerClearMethod = CardGame.class.getMethod( TRACKER_CLEAR_NAME );
83+
trackerClearMethod.invoke( entity );
84+
85+
assertThat( entity ).extracting( TRACKER_HAS_CHANGED_NAME ).isEqualTo( false );
86+
assertThat( entity ).extracting( TRACKER_GET_NAME ).isEqualTo( new String[0] );
87+
}
88+
89+
@Test
90+
public void shouldUpdateTheTracker() throws Exception {
91+
CardGame entity = new CardGame( "SPL", "Splendor" );
92+
assertThat( entity.getCode() ).isEqualTo( "XsplX" );
93+
94+
Method trackerClearMethod = CardGame.class.getMethod( TRACKER_CLEAR_NAME );
95+
trackerClearMethod.invoke( entity );
96+
97+
entity.setName( "Splendor: Cities of Splendor" );
98+
99+
assertThat( entity.getCode() )
100+
.as( "Field 'code' should have not change" ).isEqualTo( "XsplX" );
101+
assertThat( entity ).extracting( TRACKER_HAS_CHANGED_NAME ).isEqualTo( true );
102+
assertThat( entity ).extracting( TRACKER_GET_NAME ).isEqualTo( new String[] { "name" } );
103+
104+
entity.setName( "Cities of Splendor" );
105+
106+
assertThat( entity ).extracting( TRACKER_GET_NAME ).isEqualTo( new String[] { "name", "code" } );
107+
}
108+
109+
@MappedSuperclass
110+
public static abstract class TableTopGame {
111+
112+
private String code;
113+
114+
public String getCode() {
115+
return code;
116+
}
117+
118+
public void setCode(String code) {
119+
this.code = code;
120+
}
121+
}
122+
123+
@Entity(name = "CardGame")
124+
public static class CardGame extends TableTopGame {
125+
@Id
126+
private String id;
127+
128+
private String name;
129+
130+
public CardGame() {
131+
}
132+
133+
private CardGame(String id, String name) {
134+
this.id = id;
135+
this.name = name;
136+
setCode( createCode( name ) );
137+
}
138+
139+
public String getId() {
140+
return id;
141+
}
142+
143+
public void setId(String id) {
144+
this.id = id;
145+
}
146+
147+
public String getName() {
148+
return name;
149+
}
150+
151+
public void setName(String name) {
152+
this.name = name;
153+
setCode( createCode( name ) );
154+
}
155+
156+
private String createCode(String name) {
157+
return "X" + name.substring( 0, 3 ).toLowerCase() + "X";
158+
}
159+
160+
}
161+
162+
}

0 commit comments

Comments
 (0)