@@ -14,144 +14,145 @@ void main() {
14
14
15
15
tearDown (() => env.close ());
16
16
17
- test ('to-one put' , () {
18
- final src = TestEntity (tString: 'Hello' );
19
-
20
- expect (src.relA.hasValue, isFalse);
21
- expect (src.relA.target, isNull);
22
- src.relA.target = RelatedEntityA (tInt: 42 );
23
- expect (src.relA.hasValue, isTrue);
24
- expect (src.relA.target, isNotNull);
25
- expect (src.relA.target! .tInt, 42 );
26
-
27
- // Can't access targetId on new objects (not coming from box) unless
28
- // attached manually.
29
- expect (
30
- () => src.relA.targetId,
31
- throwsA (predicate (
32
- (StateError e) => e.toString ().contains ('call attach(' ))));
33
- src.relA.attach (env.store);
34
- expect (src.relA.targetId, isZero);
35
-
36
- src.relA.target! .relB.target = RelatedEntityB (tString: 'B1' );
37
-
38
- // use the same target on two relations - must insert only once
39
- src.relB.target = src.relA.target! .relB.target;
40
-
41
- env.box.put (src);
42
-
43
- var read = env.box.get (1 )! ;
44
- expect (read.tString, equals (src.tString));
45
- expect (read.relA.hasValue, isTrue);
46
- expect (read.relA.targetId, 1 );
47
- var readRelA = read.relA;
48
- expect (readRelA.target! .tInt, 42 );
49
- var readRelARelB = readRelA.target! .relB;
50
- expect (readRelARelB.target! .tString, equals ('B1' ));
51
-
52
- // it's the same DB object ID but different instances (read twice)
53
- expect (read.relB.targetId, equals (readRelARelB.targetId));
54
- expect (read.relB.target, isNot (equals (readRelARelB.target)));
55
-
56
- // attach an existing item
57
- var readRelARelBRelA = readRelARelB.target! .relA;
58
- expect (readRelARelBRelA.hasValue, isFalse);
59
- readRelARelBRelA.target = readRelA.target;
60
- expect (readRelARelBRelA.hasValue, isTrue);
61
- expect (readRelARelBRelA.targetId, readRelA.targetId);
62
- env.store.box <RelatedEntityB >().put (readRelARelB.target! );
63
-
64
- read = env.box.get (1 )! ;
65
- readRelA = read.relA;
66
- readRelARelB = readRelA.target! .relB;
67
- readRelARelBRelA = readRelARelB.target! .relA;
68
- expect (readRelARelBRelA.targetId, readRelA.targetId);
69
-
70
- // remove a relation, using [targetId]
71
- readRelARelB.targetId = 0 ;
72
- env.store.box <RelatedEntityA >().put (readRelA.target! );
73
- read = env.box.get (1 )! ;
74
- readRelA = read.relA;
75
- readRelARelB = readRelA.target! .relB;
76
- expect (readRelARelB.target, isNull);
77
- expect (readRelARelB.targetId, isZero);
78
-
79
- // remove a relation, using [target]
80
- read.relA.target = null ;
81
- env.store.box <TestEntity >().put (read);
82
- read = env.box.get (1 )! ;
83
- expect (read.relA.target, isNull);
84
- expect (read.relA.targetId, isZero);
85
- });
86
-
87
- test ('to-one lazy loading' , () {
88
- final srcBox = env.box;
89
- final targetBox = env.store.box <RelatedEntityA >();
90
- final src = TestEntity (tString: 'Hello' );
91
- final target = RelatedEntityA (tInt: 42 );
92
- target.id = targetBox.put (target);
93
-
94
- src.relA.target = target;
95
- srcBox.put (src);
96
-
97
- final read = env.box.get (1 )! ;
98
- expect (read.relA.targetId, target.id);
99
- // to verify the target is loaded lazily, we update it before accessing
100
- target.tInt = 99 ;
101
- targetBox.put (target);
102
- expect (read.relA.target! .tInt, 99 );
103
- });
17
+ group ('ToOne' , () {
18
+ test ('put' , () {
19
+ final src = TestEntity (tString: 'Hello' );
20
+ expect (src.relA.hasValue, isFalse);
21
+ expect (src.relA.target, isNull);
22
+ src.relA.target = RelatedEntityA (tInt: 42 );
23
+ expect (src.relA.hasValue, isTrue);
24
+ expect (src.relA.target, isNotNull);
25
+ expect (src.relA.target! .tInt, 42 );
26
+
27
+ // Can't access targetId on new objects (not coming from box) unless
28
+ // attached manually.
29
+ expect (
30
+ () => src.relA.targetId,
31
+ throwsA (predicate (
32
+ (StateError e) => e.toString ().contains ('call attach(' ))));
33
+ src.relA.attach (env.store);
34
+ expect (src.relA.targetId, isZero);
35
+
36
+ src.relA.target! .relB.target = RelatedEntityB (tString: 'B1' );
37
+
38
+ // use the same target on two relations - must insert only once
39
+ src.relB.target = src.relA.target! .relB.target;
40
+
41
+ env.box.put (src);
42
+
43
+ var read = env.box.get (1 )! ;
44
+ expect (read.tString, equals (src.tString));
45
+ expect (read.relA.hasValue, isTrue);
46
+ expect (read.relA.targetId, 1 );
47
+ var readRelA = read.relA;
48
+ expect (readRelA.target! .tInt, 42 );
49
+ var readRelARelB = readRelA.target! .relB;
50
+ expect (readRelARelB.target! .tString, equals ('B1' ));
51
+
52
+ // it's the same DB object ID but different instances (read twice)
53
+ expect (read.relB.targetId, equals (readRelARelB.targetId));
54
+ expect (read.relB.target, isNot (equals (readRelARelB.target)));
55
+
56
+ // attach an existing item
57
+ var readRelARelBRelA = readRelARelB.target! .relA;
58
+ expect (readRelARelBRelA.hasValue, isFalse);
59
+ readRelARelBRelA.target = readRelA.target;
60
+ expect (readRelARelBRelA.hasValue, isTrue);
61
+ expect (readRelARelBRelA.targetId, readRelA.targetId);
62
+ env.store.box <RelatedEntityB >().put (readRelARelB.target! );
63
+
64
+ read = env.box.get (1 )! ;
65
+ readRelA = read.relA;
66
+ readRelARelB = readRelA.target! .relB;
67
+ readRelARelBRelA = readRelARelB.target! .relA;
68
+ expect (readRelARelBRelA.targetId, readRelA.targetId);
69
+
70
+ // remove a relation, using [targetId]
71
+ readRelARelB.targetId = 0 ;
72
+ env.store.box <RelatedEntityA >().put (readRelA.target! );
73
+ read = env.box.get (1 )! ;
74
+ readRelA = read.relA;
75
+ readRelARelB = readRelA.target! .relB;
76
+ expect (readRelARelB.target, isNull);
77
+ expect (readRelARelB.targetId, isZero);
78
+
79
+ // remove a relation, using [target]
80
+ read.relA.target = null ;
81
+ env.store.box <TestEntity >().put (read);
82
+ read = env.box.get (1 )! ;
83
+ expect (read.relA.target, isNull);
84
+ expect (read.relA.targetId, isZero);
85
+ });
104
86
105
- test ('to-one putMany & simple ID query' , () {
106
- final src = TestEntity (tString: 'Hello' );
107
- src.relA.target = RelatedEntityA (tInt: 42 );
108
- env.box.putMany ([src, TestEntity (tString: 'there' )]);
109
- expect (src.relA.targetId, 1 );
110
-
111
- var query = env.box.query (TestEntity_ .relA.equals (1 )).build ();
112
- expect (query.count (), 1 );
113
- var read = query.find ()[0 ];
114
- expect (read.tString, equals ('Hello' ));
115
- expect (read.relA.targetId, equals (1 ));
116
- query.close ();
117
-
118
- query = env.box.query (TestEntity_ .relA.equals (0 )).build ();
119
- expect (query.count (), 1 );
120
- read = query.find ()[0 ];
121
- expect (read.tString, equals ('there' ));
122
- expect (read.relA.targetId, equals (0 ));
123
- query.close ();
124
- });
87
+ test ('lazy loading' , () {
88
+ final srcBox = env.box;
89
+ final targetBox = env.store.box <RelatedEntityA >();
90
+ final src = TestEntity (tString: 'Hello' );
91
+ final target = RelatedEntityA (tInt: 42 );
92
+ target.id = targetBox.put (target);
93
+
94
+ src.relA.target = target;
95
+ srcBox.put (src);
96
+
97
+ final read = env.box.get (1 )! ;
98
+ expect (read.relA.targetId, target.id);
99
+ // to verify the target is loaded lazily, we update it before accessing
100
+ target.tInt = 99 ;
101
+ targetBox.put (target);
102
+ expect (read.relA.target! .tInt, 99 );
103
+ });
125
104
126
- test ('to-one query link' , () {
127
- final src1 = TestEntity (tString: 'foo' );
128
- src1.relA.target = RelatedEntityA (tInt: 5 );
129
- final src2 = TestEntity (tString: 'bar' );
130
- src2.relA.target = RelatedEntityA (tInt: 10 );
131
- src2.relA.target! .relB.target = RelatedEntityB (tString: 'deep' );
132
- env.box.putMany ([src1, src2]);
133
-
134
- {
135
- final qb = env.box.query ();
136
- qb.link (TestEntity_ .relA, RelatedEntityA_ .tInt.equals (10 ));
137
- final query = qb.build ();
138
- final found = query.find ();
139
- expect (found.length, 1 );
140
- expect (found[0 ].tString, 'bar' );
105
+ test ('putMany & simple ID query' , () {
106
+ final src = TestEntity (tString: 'Hello' );
107
+ src.relA.target = RelatedEntityA (tInt: 42 );
108
+ env.box.putMany ([src, TestEntity (tString: 'there' )]);
109
+ expect (src.relA.targetId, 1 );
110
+
111
+ var query = env.box.query (TestEntity_ .relA.equals (1 )).build ();
112
+ expect (query.count (), 1 );
113
+ var read = query.find ()[0 ];
114
+ expect (read.tString, equals ('Hello' ));
115
+ expect (read.relA.targetId, equals (1 ));
141
116
query.close ();
142
- }
143
117
144
- {
145
- final qb = env.box.query ();
146
- qb
147
- .link (TestEntity_ .relA)
148
- .link (RelatedEntityA_ .relB, RelatedEntityB_ .tString.equals ('deep' ));
149
- final query = qb.build ();
150
- final found = query.find ();
151
- expect (found.length, 1 );
152
- expect (found[0 ].tString, 'bar' );
118
+ query = env.box.query (TestEntity_ .relA.equals (0 )).build ();
119
+ expect (query.count (), 1 );
120
+ read = query.find ()[0 ];
121
+ expect (read.tString, equals ('there' ));
122
+ expect (read.relA.targetId, equals (0 ));
153
123
query.close ();
154
- }
124
+ });
125
+
126
+ test ('query link' , () {
127
+ final src1 = TestEntity (tString: 'foo' );
128
+ src1.relA.target = RelatedEntityA (tInt: 5 );
129
+ final src2 = TestEntity (tString: 'bar' );
130
+ src2.relA.target = RelatedEntityA (tInt: 10 );
131
+ src2.relA.target! .relB.target = RelatedEntityB (tString: 'deep' );
132
+ env.box.putMany ([src1, src2]);
133
+
134
+ {
135
+ final qb = env.box.query ();
136
+ qb.link (TestEntity_ .relA, RelatedEntityA_ .tInt.equals (10 ));
137
+ final query = qb.build ();
138
+ final found = query.find ();
139
+ expect (found.length, 1 );
140
+ expect (found[0 ].tString, 'bar' );
141
+ query.close ();
142
+ }
143
+
144
+ {
145
+ final qb = env.box.query ();
146
+ qb
147
+ .link (TestEntity_ .relA)
148
+ .link (RelatedEntityA_ .relB, RelatedEntityB_ .tString.equals ('deep' ));
149
+ final query = qb.build ();
150
+ final found = query.find ();
151
+ expect (found.length, 1 );
152
+ expect (found[0 ].tString, 'bar' );
153
+ query.close ();
154
+ }
155
+ });
155
156
});
156
157
157
158
group ('ToMany list management' , () {
@@ -244,6 +245,16 @@ void main() {
244
245
check (src! .relManyA, items: [1 , 3 , 4 ], added: [], removed: []);
245
246
});
246
247
248
+ // note: this requires box.attach() in Java/Kotlin, should not here.
249
+ test ('put: self-assigned ID on source' , () {
250
+ src! .id = 42 ;
251
+ src! .relManyA.add (RelatedEntityA (tInt: 1 ));
252
+ env.box.put (src! );
253
+
254
+ src = env.box.get (42 );
255
+ check (src! .relManyA, items: [1 ], added: [], removed: []);
256
+ });
257
+
247
258
test ("don't load old data when just adding" , () {
248
259
expect (src! .relManyA, isNotNull);
249
260
src! .relManyA.add (RelatedEntityA (tInt: 1 ));
0 commit comments