rtext 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +120 -89
  3. data/Project.yaml +15 -0
  4. data/RText_Protocol +47 -4
  5. data/lib/rtext/context_builder.rb +49 -8
  6. data/lib/rtext/default_completer.rb +212 -163
  7. data/lib/rtext/default_service_provider.rb +3 -3
  8. data/lib/rtext/frontend/connector.rb +130 -56
  9. data/lib/rtext/instantiator.rb +11 -3
  10. data/lib/rtext/language.rb +5 -5
  11. data/lib/rtext/serializer.rb +3 -3
  12. data/lib/rtext/service.rb +281 -253
  13. data/lib/rtext/tokenizer.rb +2 -2
  14. metadata +33 -33
  15. data/Rakefile +0 -46
  16. data/test/completer_test.rb +0 -606
  17. data/test/context_builder_test.rb +0 -948
  18. data/test/frontend/context_test.rb +0 -301
  19. data/test/instantiator_test.rb +0 -1704
  20. data/test/integration/backend.out +0 -13
  21. data/test/integration/crash_on_request_editor.rb +0 -12
  22. data/test/integration/ecore_editor.rb +0 -50
  23. data/test/integration/frontend.log +0 -38203
  24. data/test/integration/model/invalid_encoding.invenc +0 -2
  25. data/test/integration/model/test.crash_on_request +0 -18
  26. data/test/integration/model/test.crashing_backend +0 -18
  27. data/test/integration/model/test.dont_open_socket +0 -0
  28. data/test/integration/model/test.invalid_cmd_line +0 -0
  29. data/test/integration/model/test.not_in_rtext +0 -0
  30. data/test/integration/model/test_large_with_errors.ect3 +0 -43523
  31. data/test/integration/model/test_metamodel.ect +0 -24
  32. data/test/integration/model/test_metamodel2.ect +0 -5
  33. data/test/integration/model/test_metamodel3.ect4 +0 -7
  34. data/test/integration/model/test_metamodel_error.ect2 +0 -3
  35. data/test/integration/model/test_metamodel_ok.ect2 +0 -18
  36. data/test/integration/test.rb +0 -966
  37. data/test/link_detector_test.rb +0 -287
  38. data/test/message_helper_test.rb +0 -118
  39. data/test/rtext_test.rb +0 -11
  40. data/test/serializer_test.rb +0 -1004
  41. data/test/tokenizer_test.rb +0 -173
@@ -1,966 +0,0 @@
1
- # encoding: binary
2
- $:.unshift(File.dirname(__FILE__)+"/../../lib")
3
- require 'test/unit'
4
- require 'rtext/frontend/connector_manager'
5
- require 'rtext/frontend/context'
6
- require 'logger'
7
-
8
- class IntegrationTest < Test::Unit::TestCase
9
-
10
- ModelFile = File.dirname(__FILE__)+"/model/test_metamodel.ect"
11
- ModelFile2 = File.dirname(__FILE__)+"/model/test_metamodel2.ect"
12
- ModelFile3 = File.dirname(__FILE__)+"/model/test_metamodel3.ect4"
13
- LargeWithErrorsFile = File.dirname(__FILE__)+"/model/test_large_with_errors.ect3"
14
- InvalidEncodingFile = File.dirname(__FILE__)+"/model/invalid_encoding.invenc"
15
- NotInRTextFile = File.dirname(__FILE__)+"/model/test.not_in_rtext"
16
- InvalidCmdLineFile = File.dirname(__FILE__)+"/model/test.invalid_cmd_line"
17
- CrashingBackendFile = File.dirname(__FILE__)+"/model/test.crashing_backend"
18
- DontOpenSocketFile = File.dirname(__FILE__)+"/model/test.dont_open_socket"
19
- CrashOnRequestFile = File.dirname(__FILE__)+"/model/test.crash_on_request"
20
-
21
- def setup_connector(file)
22
- @infile = file
23
- outfile = File.dirname(__FILE__)+"/backend.out"
24
- logfile = File.dirname(__FILE__)+"/frontend.log"
25
- logger = Logger.new(logfile)
26
- File.unlink(outfile) if File.exist?(outfile)
27
- @connection_timeout = false
28
- man = RText::Frontend::ConnectorManager.new(
29
- :logger => logger,
30
- :keep_outfile => true,
31
- :connection_timeout => 1,
32
- :outfile_provider => lambda { File.expand_path(outfile) },
33
- :connect_callback => lambda do |connector, state|
34
- @connection_timeout = true if state == :timeout
35
- end)
36
- @con = man.connector_for_file(@infile)
37
- end
38
-
39
- def teardown
40
- @con.stop if @con
41
- end
42
-
43
- def test_non_existing_file
44
- setup_connector("this is not a file")
45
- assert_nil @con
46
- end
47
-
48
- def test_not_in_rtext_file
49
- setup_connector(NotInRTextFile)
50
- assert_nil @con
51
- end
52
-
53
- def test_invalid_command_line
54
- setup_connector(InvalidCmdLineFile)
55
- assert @con
56
- response = load_model
57
- assert @connection_timeout
58
- end
59
-
60
- def test_crashing_backend
61
- setup_connector(CrashingBackendFile)
62
- assert @con
63
- response = load_model
64
- assert @connection_timeout
65
- end
66
-
67
- def test_backend_doesnt_open_socket
68
- setup_connector(DontOpenSocketFile)
69
- assert @con
70
- response = load_model
71
- assert @connection_timeout
72
- end
73
-
74
- def test_backend_crash_on_request
75
- setup_connector(CrashOnRequestFile)
76
- assert @con
77
- response = load_model
78
- assert_equal [], response["problems"]
79
- response = @con.execute_command({"command" => "link_targets", "context" => [], "column" => 1})
80
- assert_equal :timeout, response
81
- end
82
-
83
- # simulate external encoding utf-8 (-E in .rext) containing a iso-8859-1 character
84
- def test_invalid_encoding
85
- setup_connector(InvalidEncodingFile)
86
- response = load_model
87
- assert_equal "response", response["type"]
88
- assert_equal [], response["problems"]
89
- text = %Q(EPackage "iso-8859-1 umlaut: \xe4",| nsPrefix: "")
90
- context = build_context(text)
91
- assert_completions context, [
92
- "nsPrefix:",
93
- "nsURI:"
94
- ]
95
- end
96
-
97
- def test_loadmodel
98
- setup_connector(ModelFile)
99
- response = load_model
100
- assert_equal "response", response["type"]
101
- assert_equal [], response["problems"]
102
- end
103
-
104
- def test_loadmodel_large_with_errors
105
- setup_connector(LargeWithErrorsFile)
106
- response = load_model
107
- assert_equal "response", response["type"]
108
- assert_equal 43523, response["problems"].first["problems"].size
109
- end
110
-
111
- def test_unknown_command
112
- setup_connector(ModelFile)
113
- response = load_model
114
- response = @con.execute_command({"command" => "unknown"})
115
- assert_equal "unknown_command_error", response["type"]
116
- end
117
-
118
- #TODO: connector restart when .rtext file changes
119
-
120
- def test_complete_first_line
121
- setup_connector(ModelFile)
122
- load_model
123
- context = build_context <<-END
124
- |EPackage StatemachineMM {
125
- END
126
- assert_completions context, [
127
- "EPackage"
128
- ]
129
- context = build_context <<-END
130
- EPackage| StatemachineMM {
131
- END
132
- assert_completions context, [
133
- "EPackage"
134
- ]
135
- context = build_context <<-END
136
- EPackage |StatemachineMM {
137
- END
138
- assert_completions context, [
139
- "name",
140
- "nsPrefix:",
141
- "nsURI:"
142
- ]
143
- context = build_context <<-END
144
- EPackage S|tatemachineMM {
145
- END
146
- assert_completions context, [
147
- "name",
148
- "nsPrefix:",
149
- "nsURI:"
150
- ]
151
- context = build_context <<-END
152
- EPackage StatemachineMM| {
153
- END
154
- assert_completions context, [
155
- "name",
156
- "nsPrefix:",
157
- "nsURI:"
158
- ]
159
- context = build_context <<-END
160
- EPackage StatemachineMM |{
161
- END
162
- assert_completions context, [
163
- ]
164
- context = build_context <<-END
165
- EPackage StatemachineMM {|
166
- END
167
- # these columns don't exist
168
- assert_completions context, []
169
- context = build_context({:col => 27}, "EPackage StatemachineMM {")
170
- assert_completions context, []
171
- context = build_context({:col => 28}, "EPackage StatemachineMM {")
172
- assert_completions context, []
173
- context = build_context({:col => 100}, "EPackage StatemachineMM {")
174
- assert_completions context, []
175
- # before first column is like first column
176
- context = build_context({:col => 0}, "EPackage StatemachineMM {")
177
- assert_completions context, [
178
- "EPackage"
179
- ]
180
- context = build_context({:col => -1}, "EPackage StatemachineMM {")
181
- assert_completions context, [
182
- "EPackage"
183
- ]
184
- context = build_context({:col => -100}, "EPackage StatemachineMM {")
185
- assert_completions context, [
186
- "EPackage"
187
- ]
188
- end
189
-
190
- def test_nested_command
191
- setup_connector(ModelFile)
192
- load_model
193
- context = build_context <<-END
194
- EPackage StatemachineMM {
195
- | EClass State, abstract: true {
196
- END
197
- assert_completions context, [
198
- "EAnnotation",
199
- "EClass",
200
- "EClassifier",
201
- "EDataType",
202
- "EEnum",
203
- "EGenericType",
204
- "EPackage"
205
- ]
206
- context = build_context <<-END
207
- EPackage StatemachineMM {
208
- |EClass State, abstract: true {
209
- END
210
- assert_completions context, [
211
- "EAnnotation",
212
- "EClass",
213
- "EClassifier",
214
- "EDataType",
215
- "EEnum",
216
- "EGenericType",
217
- "EPackage"
218
- ]
219
- context = build_context <<-END
220
- EPackage StatemachineMM {
221
- EC|lass State, abstract: true {
222
- END
223
- assert_completions context, [
224
- "EAnnotation",
225
- "EClass",
226
- "EClassifier",
227
- "EDataType",
228
- "EEnum",
229
- "EGenericType",
230
- "EPackage"
231
- ]
232
- context = build_context <<-END
233
- EPackage StatemachineMM {
234
- EClass| State, abstract: true {
235
- END
236
- assert_completions context, [
237
- "EAnnotation",
238
- "EClass",
239
- "EClassifier",
240
- "EDataType",
241
- "EEnum",
242
- "EGenericType",
243
- "EPackage"
244
- ]
245
- context = build_context <<-END
246
- EPackage StatemachineMM {
247
- EClass |State, abstract: true {
248
- END
249
- assert_completions context, [
250
- "name",
251
- "abstract:",
252
- "interface:",
253
- "eSuperTypes:",
254
- "instanceClassName:"
255
- ]
256
- context = build_context <<-END
257
- EPackage StatemachineMM {
258
- EClass S|tate, abstract: true {
259
- END
260
- assert_completions context, [
261
- "name",
262
- "abstract:",
263
- "interface:",
264
- "eSuperTypes:",
265
- "instanceClassName:"
266
- ]
267
- context = build_context <<-END
268
- EPackage StatemachineMM {
269
- EClass State|, abstract: true {
270
- END
271
- assert_completions context, [
272
- "name",
273
- "abstract:",
274
- "interface:",
275
- "eSuperTypes:",
276
- "instanceClassName:"
277
- ]
278
- context = build_context <<-END
279
- EPackage StatemachineMM {
280
- EClass State,| abstract: true {
281
- END
282
- assert_completions context, [
283
- "abstract:",
284
- "interface:",
285
- "eSuperTypes:",
286
- "instanceClassName:"
287
- ]
288
- context = build_context <<-END
289
- EPackage StatemachineMM {
290
- EClass State, |abstract: true {
291
- END
292
- assert_completions context, [
293
- "abstract:",
294
- "interface:",
295
- "eSuperTypes:",
296
- "instanceClassName:"
297
- ]
298
- context = build_context <<-END
299
- EPackage StatemachineMM {
300
- EClass State, a|bstract: true {
301
- END
302
- assert_completions context, [
303
- "abstract:",
304
- "interface:",
305
- "eSuperTypes:",
306
- "instanceClassName:"
307
- ]
308
- context = build_context <<-END
309
- EPackage StatemachineMM {
310
- EClass State, abstract:| true {
311
- END
312
- assert_completions context, [
313
- "true",
314
- "false"
315
- ]
316
- context = build_context <<-END
317
- EPackage StatemachineMM {
318
- EClass State, abstract: |true {
319
- END
320
- assert_completions context, [
321
- "true",
322
- "false"
323
- ]
324
- context = build_context <<-END
325
- EPackage StatemachineMM {
326
- EClass State, abstract: t|rue {
327
- END
328
- assert_completions context, [
329
- "true",
330
- "false"
331
- ]
332
- context = build_context <<-END
333
- EPackage StatemachineMM {
334
- EClass State, abstract: true| {
335
- END
336
- assert_completions context, [
337
- "true",
338
- "false"
339
- ]
340
- context = build_context <<-END
341
- EPackage StatemachineMM {
342
- EClass State, abstract: true |{
343
- END
344
- assert_completions context, [
345
- ]
346
- context = build_context <<-END
347
- EPackage StatemachineMM {
348
- EClass State, abstract: true {|
349
- END
350
- assert_completions context, [
351
- ]
352
- end
353
-
354
- def test_complete_feature_after_linebreak
355
- setup_connector(ModelFile)
356
- load_model
357
- context = build_context <<-END
358
- EPackage StatemachineMM {
359
- EClass State, abstract: true {
360
- EAttribute name, eType: /StatemachineMM/StringType
361
- EReference parent,
362
- |eType: /StatemachineMM/CompositeState,
363
- END
364
- assert_completions context, [
365
- "containment:",
366
- "resolveProxies:",
367
- "eOpposite:",
368
- "changeable:",
369
- "defaultValueLiteral:",
370
- "derived:",
371
- "transient:",
372
- "unsettable:",
373
- "volatile:",
374
- "lowerBound:",
375
- "ordered:",
376
- "unique:",
377
- "upperBound:",
378
- "eType:"
379
- ]
380
- end
381
-
382
- def test_complete_reference_after_linebreak
383
- setup_connector(ModelFile)
384
- load_model
385
- context = build_context <<-END
386
- EPackage StatemachineMM {
387
- EClass State, abstract: true {
388
- EAttribute name, eType: /StatemachineMM/StringType
389
- EReference parent,
390
- eType: |/StatemachineMM/CompositeState,
391
- END
392
- assert_completions context, [
393
- "/StatemachineMM/CompositeState",
394
- "/StatemachineMM/SimpleState",
395
- "/StatemachineMM/State",
396
- "/StatemachineMM/StringType",
397
- "/StatemachineMM/Transition",
398
- "/StatemachineMM2/SimpleState",
399
- "/StatemachineMM2/State"
400
- ]
401
- end
402
-
403
- def test_complete_command_after_linebreak
404
- setup_connector(ModelFile)
405
- load_model
406
- context = build_context <<-END
407
- EPackage StatemachineMM {
408
- EClass State, abstract: true {
409
- EAttribute name, eType: /StatemachineMM/StringType
410
- EReference parent,
411
- eType: /StatemachineMM/CompositeState,
412
- eOpposite: /StatemachineMM/CompositeState/substates
413
- }
414
- EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
415
- EClass CompositeState,
416
- eSuperTypes: [
417
- /StatemachineMM/State
418
- ],
419
- abstract: false {
420
- |EReference substates, upperBound: -1, containment: true, eType: /StatemachineMM/State, eOpposite: /StatemachineMM/State/parent
421
- END
422
- assert_completions context, [
423
- "EAnnotation",
424
- "EAttribute",
425
- "EOperation",
426
- "EReference",
427
- "EStructuralFeature"
428
- ]
429
- end
430
-
431
- def test_complete_value_after_linebreak
432
- setup_connector(ModelFile)
433
- load_model
434
- context = build_context <<-END
435
- EPackage StatemachineMM {
436
- EClass State, abstract: true {
437
- EAttribute name, eType: /StatemachineMM/StringType
438
- EReference parent,
439
- eType: /StatemachineMM/CompositeState,
440
- eOpposite: /StatemachineMM/CompositeState/substates
441
- }
442
- EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
443
- EClass CompositeState,
444
- eSuperTypes: [
445
- /StatemachineMM/State
446
- ],
447
- abstract: |false {
448
- END
449
- assert_completions context, [
450
- "true",
451
- "false"
452
- ]
453
- end
454
-
455
- def test_complete_in_array_after_linebreak
456
- setup_connector(ModelFile)
457
- load_model
458
- context = build_context <<-END
459
- EPackage StatemachineMM {
460
- EClass State, abstract: true {
461
- EAttribute name, eType: /StatemachineMM/StringType
462
- EReference parent,
463
- eType: /StatemachineMM/CompositeState,
464
- eOpposite: /StatemachineMM/CompositeState/substates
465
- }
466
- EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
467
- EClass CompositeState,
468
- eSuperTypes: [
469
- |/StatemachineMM/State
470
- END
471
- assert_completions context, [
472
- "/StatemachineMM/CompositeState",
473
- "/StatemachineMM/SimpleState",
474
- "/StatemachineMM/State",
475
- "/StatemachineMM/Transition",
476
- "/StatemachineMM2/SimpleState",
477
- "/StatemachineMM2/State"
478
- ]
479
- end
480
-
481
- def test_complete_in_array_after_linebreak2
482
- setup_connector(ModelFile)
483
- load_model
484
- context = build_context <<-END
485
- EPackage StatemachineMM {
486
- EClass State, abstract: true {
487
- EAttribute name, eType: /StatemachineMM/StringType
488
- EReference parent,
489
- eType: /StatemachineMM/CompositeState,
490
- eOpposite: /StatemachineMM/CompositeState/substates
491
- }
492
- EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
493
- EClass CompositeState,
494
- eSuperTypes: [
495
- /StatemachineMM/State
496
- |],
497
- END
498
- assert_completions context, [
499
- ]
500
- end
501
-
502
- def test_complete_after_backslash
503
- setup_connector(ModelFile3)
504
- load_model
505
- context = build_context <<-END
506
- EPackage StatemachineMM3 {
507
- EClass State
508
- EClass \\
509
- |SimpleState,
510
- END
511
- assert_completions context, [
512
- "name",
513
- "abstract:",
514
- "interface:",
515
- "eSuperTypes:",
516
- "instanceClassName:"
517
- ]
518
- end
519
-
520
- def test_complete_after_backslash2
521
- setup_connector(ModelFile3)
522
- load_model
523
- context = build_context <<-END
524
- EPackage StatemachineMM3 {
525
- EClass State
526
- EClass \\
527
- SimpleState,
528
- |eSuperTypes: [/StatemachineMM3/State]
529
- END
530
- assert_completions context, [
531
- "abstract:",
532
- "interface:",
533
- "eSuperTypes:",
534
- "instanceClassName:"
535
- ]
536
- end
537
-
538
- def test_link_target_after_backslash
539
- setup_connector(ModelFile3)
540
- load_model
541
- context = build_context <<-END
542
- EPackage StatemachineMM3 {
543
- EClass State
544
- EClass \\
545
- SimpleState,
546
- eSuperTypes: [/S|tatemachineMM3/State]
547
- END
548
- assert_link_targets context, :file => ModelFile3, :begin => 45, :end => 66, :targets => [
549
- {"file"=> File.expand_path(ModelFile3),
550
- "line"=>2,
551
- "display"=>"/StatemachineMM3/State [EClass]"}
552
- ]
553
- end
554
-
555
- def test_reference_completion
556
- setup_connector(ModelFile)
557
- load_model
558
- context = build_context <<-END
559
- EPackage StatemachineMM {
560
- EClass State, abstract: true {
561
- EAttribute name, eType: |/StatemachineMM/StringType
562
- END
563
- assert_completions context, [
564
- "/StatemachineMM/CompositeState",
565
- "/StatemachineMM/SimpleState",
566
- "/StatemachineMM/State",
567
- "/StatemachineMM/StringType",
568
- "/StatemachineMM/Transition",
569
- "/StatemachineMM2/SimpleState",
570
- "/StatemachineMM2/State",
571
- ]
572
- context = build_context <<-END
573
- EPackage StatemachineMM {
574
- EClass State, abstract: true {
575
- EAttribute name, eType: /StatemachineMM/|StringType
576
- END
577
- assert_completions context, [
578
- "/StatemachineMM/CompositeState",
579
- "/StatemachineMM/SimpleState",
580
- "/StatemachineMM/State",
581
- "/StatemachineMM/StringType",
582
- "/StatemachineMM/Transition",
583
- "/StatemachineMM2/SimpleState",
584
- "/StatemachineMM2/State",
585
- ]
586
- context = build_context <<-END
587
- EPackage StatemachineMM {
588
- EClass State, abstract: true {
589
- EAttribute name, eType: /StatemachineMM/St|ringType
590
- END
591
- assert_completions context, [
592
- "/StatemachineMM/CompositeState",
593
- "/StatemachineMM/SimpleState",
594
- "/StatemachineMM/State",
595
- "/StatemachineMM/StringType",
596
- "/StatemachineMM/Transition",
597
- "/StatemachineMM2/SimpleState",
598
- "/StatemachineMM2/State",
599
- ]
600
- context = build_context <<-END
601
- EPackage StatemachineMM {
602
- EClass State, abstract: true {
603
- EAttribute name, eType: /StatemachineMM/StringType|
604
- END
605
- assert_completions context, [
606
- "/StatemachineMM/CompositeState",
607
- "/StatemachineMM/SimpleState",
608
- "/StatemachineMM/State",
609
- "/StatemachineMM/StringType",
610
- "/StatemachineMM/Transition",
611
- "/StatemachineMM2/SimpleState",
612
- "/StatemachineMM2/State",
613
- ]
614
- end
615
-
616
- def test_reference_completion_in_array
617
- setup_connector(ModelFile)
618
- load_model
619
- context = build_context <<-END
620
- EPackage StatemachineMM {
621
- EClass State, abstract: true {
622
- EAttribute name, eType: /StatemachineMM/StringType
623
- EReference parent,
624
- eType: /StatemachineMM/CompositeState,
625
- eOpposite: /StatemachineMM/CompositeState/substates
626
- }
627
- EClass SimpleState, eSuperTypes: [|/StatemachineMM/State]
628
- END
629
- assert_completions context, [
630
- "/StatemachineMM/CompositeState",
631
- "/StatemachineMM/SimpleState",
632
- "/StatemachineMM/State",
633
- "/StatemachineMM/Transition",
634
- "/StatemachineMM2/SimpleState",
635
- "/StatemachineMM2/State",
636
- ]
637
- context = build_context <<-END
638
- EPackage StatemachineMM {
639
- EClass State, abstract: true {
640
- EAttribute name, eType: /StatemachineMM/StringType
641
- EReference parent,
642
- eType: /StatemachineMM/CompositeState,
643
- eOpposite: /StatemachineMM/CompositeState/substates
644
- }
645
- EClass SimpleState, eSuperTypes: [/StatemachineMM/S|tate]
646
- END
647
- assert_completions context, [
648
- "/StatemachineMM/CompositeState",
649
- "/StatemachineMM/SimpleState",
650
- "/StatemachineMM/State",
651
- "/StatemachineMM/Transition",
652
- "/StatemachineMM2/SimpleState",
653
- "/StatemachineMM2/State",
654
- ]
655
- context = build_context <<-END
656
- EPackage StatemachineMM {
657
- EClass State, abstract: true {
658
- EAttribute name, eType: /StatemachineMM/StringType
659
- EReference parent,
660
- eType: /StatemachineMM/CompositeState,
661
- eOpposite: /StatemachineMM/CompositeState/substates
662
- }
663
- EClass SimpleState, eSuperTypes: [/StatemachineMM/State|]
664
- END
665
- assert_completions context, [
666
- "/StatemachineMM/CompositeState",
667
- "/StatemachineMM/SimpleState",
668
- "/StatemachineMM/State",
669
- "/StatemachineMM/Transition",
670
- "/StatemachineMM2/SimpleState",
671
- "/StatemachineMM2/State",
672
- ]
673
- context = build_context <<-END
674
- EPackage StatemachineMM {
675
- EClass State, abstract: true {
676
- EAttribute name, eType: /StatemachineMM/StringType
677
- EReference parent,
678
- eType: /StatemachineMM/CompositeState,
679
- eOpposite: /StatemachineMM/CompositeState/substates
680
- }
681
- EClass SimpleState, eSuperTypes: [/StatemachineMM/State]|
682
- END
683
- assert_completions context, [
684
- ]
685
- end
686
-
687
- def test_integer_completion
688
- setup_connector(ModelFile)
689
- load_model
690
- context = build_context <<-END
691
- EPackage StatemachineMM {
692
- EClass State, abstract: true {
693
- EAttribute name, eType: /StatemachineMM/StringType
694
- EReference parent,
695
- eType: /StatemachineMM/CompositeState,
696
- eOpposite: /StatemachineMM/CompositeState/substates
697
- }
698
- EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
699
- EClass CompositeState,
700
- eSuperTypes: [
701
- /StatemachineMM/State
702
- ],
703
- abstract: false {
704
- EReference substates, upperBound: |-1, containment: true, eType: /StatemachineMM/State, eOpposite: /StatemachineMM/State/parent
705
- END
706
- assert_completions context, [
707
- "0",
708
- ]
709
- context = build_context <<-END
710
- EPackage StatemachineMM {
711
- EClass State, abstract: true {
712
- EAttribute name, eType: /StatemachineMM/StringType
713
- EReference parent,
714
- eType: /StatemachineMM/CompositeState,
715
- eOpposite: /StatemachineMM/CompositeState/substates
716
- }
717
- EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
718
- EClass CompositeState,
719
- eSuperTypes: [
720
- /StatemachineMM/State
721
- ],
722
- abstract: false {
723
- EReference substates, upperBound: -1|, containment: true, eType: /StatemachineMM/State, eOpposite: /StatemachineMM/State/parent
724
- END
725
- assert_completions context, [
726
- "0",
727
- ]
728
- end
729
-
730
- def test_link_targets
731
- setup_connector(ModelFile)
732
- load_model
733
- context = build_context <<-END
734
- EPackage StatemachineMM {
735
- EClass State, abstract: true {
736
- EAttribute name, eType: /St|atemachineMM/StringType
737
- END
738
- assert_link_targets context, :begin => 29, :end => 54, :targets => [
739
- {"file"=> File.expand_path(@infile),
740
- "line"=>20,
741
- "display"=>"/StatemachineMM/StringType [EDataType]"}
742
- ]
743
- context = build_context <<-END
744
- EPackage StatemachineMM {
745
- EClass State, abstract: true {
746
- EAttribute name, eType: |/StatemachineMM/StringType
747
- END
748
- assert_link_targets context, :begin => 29, :end => 54, :targets => [
749
- {"file"=> File.expand_path(@infile),
750
- "line"=>20,
751
- "display"=>"/StatemachineMM/StringType [EDataType]"}
752
- ]
753
- context = build_context <<-END
754
- EPackage StatemachineMM {
755
- EClass State, abstract: true {
756
- EAttribute name, eType: /StatemachineMM/StringTyp|e
757
- END
758
- assert_link_targets context, :begin => 29, :end => 54, :targets => [
759
- {"file"=> File.expand_path(@infile),
760
- "line"=>20,
761
- "display"=>"/StatemachineMM/StringType [EDataType]"}
762
- ]
763
- context = build_context <<-END
764
- EPackage StatemachineMM {
765
- EClass State, abstract: true {
766
- EAttribute name, eType: /StatemachineMM/StringType|
767
- END
768
- assert_link_targets context, :begin => nil, :end => nil, :targets => []
769
- context = build_context <<-END
770
- EPackage StatemachineMM {
771
- EClass State, abstract: true {
772
- EAttribute name, eType:| /StatemachineMM/StringType
773
- END
774
- assert_link_targets context, :begin => nil, :end => nil, :targets => []
775
- # backward ref
776
- context = build_context <<-END
777
- EPackage StatemachineMM {
778
- E|Class State, abstract: true {
779
- END
780
- assert_link_targets context, :begin => 3, :end => 8, :targets => [
781
- {"file"=> File.expand_path(@infile),
782
- "line"=>8,
783
- "display"=>"/StatemachineMM/SimpleState [EClass]"},
784
- {"file"=> File.expand_path(@infile),
785
- "line"=>9,
786
- "display"=>"/StatemachineMM/CompositeState [EClass]"}
787
- ]
788
- context = build_context <<-END
789
- EPackage StatemachineMM {
790
- EClass State, abstract: true {
791
- EAttribute name, eType: /StatemachineMM/StringType
792
- EReference parent,
793
- eType: /StatemachineMM/CompositeState,
794
- eOpposite: /StatemachineMM/CompositeState/substates
795
- }
796
- |EClass SimpleState, eSuperTypes: [/StatemachineMM/State]
797
- END
798
- assert_link_targets context, :begin => 3, :end => 8, :targets => []
799
- # bad location
800
- context = build_context <<-END
801
- EPackage S|tatemachineMM {
802
- END
803
- assert_link_targets context, :begin => 10, :end => 23, :targets => []
804
- end
805
-
806
- def test_link_targets_no_text_after_name
807
- setup_connector(ModelFile)
808
- load_model
809
- context = build_context({:infile => ModelFile2}, <<-END
810
- EPackage StatemachineMM2 {
811
- ECl|ass State
812
- END
813
- )
814
- assert_link_targets context, :file => ModelFile2, :begin => 3, :end => 8, :targets => [
815
- {"file"=> File.expand_path(ModelFile2),
816
- "line"=>3,
817
- "display"=>"/StatemachineMM2/SimpleState [EClass]"}
818
- ]
819
- end
820
-
821
- def test_link_targets_after_linebreak
822
- setup_connector(ModelFile)
823
- load_model
824
- context = build_context <<-END
825
- EPackage StatemachineMM {
826
- EClass State, abstract: true {
827
- EAttribute name, eType: /StatemachineMM/StringType
828
- EReference parent,
829
- eType: /St|atemachineMM/CompositeState,
830
- END
831
- # in case of linebreaks, the begin and end column refer to the string which
832
- # was passed to the backend as the context; in this case the context extractor
833
- # appends each broken line to the previous line with all the leading whitespace removed
834
- assert_link_targets context, :begin => 37, :end => 66, :targets => [
835
- {"file"=> File.expand_path(@infile),
836
- "line"=>9,
837
- "display"=>"/StatemachineMM/CompositeState [EClass]"}
838
- ]
839
- context = build_context <<-END
840
- EPackage StatemachineMM {
841
- EClass State, abstract: true {
842
- EAttribute name, eType: /StatemachineMM/StringType
843
- EReference parent,
844
- eType: |/StatemachineMM/CompositeState,
845
- END
846
- assert_link_targets context, :begin => 37, :end => 66, :targets => [
847
- {"file"=> File.expand_path(@infile),
848
- "line"=>9,
849
- "display"=>"/StatemachineMM/CompositeState [EClass]"}
850
- ]
851
- context = build_context <<-END
852
- EPackage StatemachineMM {
853
- EClass State, abstract: true {
854
- EAttribute name, eType: /StatemachineMM/StringType
855
- EReference parent,
856
- eType: /StatemachineMM/CompositeStat|e,
857
- END
858
- assert_link_targets context, :begin => 37, :end => 66, :targets => [
859
- {"file"=> File.expand_path(@infile),
860
- "line"=>9,
861
- "display"=>"/StatemachineMM/CompositeState [EClass]"}
862
- ]
863
- context = build_context <<-END
864
- EPackage StatemachineMM {
865
- EClass State, abstract: true {
866
- EAttribute name, eType: /StatemachineMM/StringType
867
- EReference parent,
868
- eType: /StatemachineMM/CompositeState|,
869
- END
870
- assert_link_targets context, :begin => nil, :end => nil, :targets => []
871
- end
872
-
873
- def test_find_elements
874
- setup_connector(ModelFile)
875
- load_model
876
- response = @con.execute_command(
877
- {"command" => "find_elements", "search_pattern" => "Sta"})
878
- assert_equal \
879
- [{"display"=>"State [EClass] - /StatemachineMM",
880
- "file"=> File.expand_path(@infile),
881
- "line"=>2},
882
- {"display"=>"State [EClass] - /StatemachineMM2",
883
- "file"=> File.expand_path(ModelFile2),
884
- "line"=>2},
885
- {"display"=>"StatemachineMM [EPackage] - /StatemachineMM",
886
- "file"=> File.expand_path(@infile),
887
- "line"=>1},
888
- {"display"=>"StatemachineMM2 [EPackage] - /StatemachineMM2",
889
- "file"=> File.expand_path(ModelFile2),
890
- "line"=>1}], response["elements"]
891
- response = @con.execute_command(
892
- {"command" => "find_elements", "search_pattern" => "target"})
893
- assert_equal \
894
- [{"display"=>"target [EReference] - /StatemachineMM/Transition",
895
- "file"=> File.expand_path(@infile),
896
- "line"=>17}], response["elements"]
897
- response = @con.execute_command(
898
- {"command" => "find_elements", "search_pattern" => ""})
899
- assert_equal [], response["elements"]
900
- response = @con.execute_command(
901
- {"command" => "find_elements", "search_pattern" => "xxx"})
902
- assert_equal [], response["elements"]
903
- end
904
-
905
- TestContext = Struct.new(:line, :col)
906
-
907
- def build_context(text, text2=nil)
908
- if text.is_a?(Hash)
909
- context_lines = text2.split("\n")
910
- pos_in_line = text[:col] || context_lines.last.index("|") + 1
911
- infile = text[:infile] || @infile
912
- else
913
- context_lines = text.split("\n")
914
- pos_in_line = context_lines.last.index("|") + 1
915
- infile = @infile
916
- end
917
- context_lines.last.sub!("|", "")
918
-
919
- # check that the context data actally matches the real file in the filesystem
920
- content = File.open(infile, "rb"){|f| f.read}
921
- ref_lines = content.split(/\r?\n/)[0..context_lines.size-1]
922
- raise "inconsistent test data, expected\n:#{ref_lines.join("\n")}\ngot:\n#{context_lines.join("\n")}\n" \
923
- unless ref_lines == context_lines
924
-
925
- # column numbers start at 1
926
- TestContext.new(context_lines.size, pos_in_line)
927
- end
928
-
929
- def assert_link_targets(context, options)
930
- infile = options[:file] || @infile
931
- content = File.open(infile, "rb") {|f| f.read}
932
- lines = content.split(/\r?\n/)[0..context.line-1]
933
- lines, col = RText::Frontend::Context.new.extract(lines, context.col)
934
- response = @con.execute_command(
935
- {"command" => "link_targets", "context" => lines, "column" => col})
936
- assert_equal "response", response["type"]
937
- assert_equal options[:targets], response["targets"]
938
- assert_equal options[:begin], response["begin_column"]
939
- assert_equal options[:end], response["end_column"]
940
- end
941
-
942
- def assert_completions(context, expected)
943
- content = File.open(@infile, "rb"){|f| f.read}
944
- lines = content.split(/\r?\n/)[0..context.line-1]
945
- lines, col = RText::Frontend::Context.new.extract(lines, context.col)
946
- response = @con.execute_command(
947
- {"command" => "content_complete", "context" => lines, "column" => col})
948
- assert_equal expected, response["options"].collect{|o| o["insert"]}
949
- end
950
-
951
- def load_model
952
- done = false
953
- response = nil
954
- while !done
955
- response = @con.execute_command({"command" => "load_model"})
956
- if response == :connecting && !@connection_timeout
957
- sleep(0.1)
958
- @con.resume
959
- else
960
- done = true
961
- end
962
- end
963
- response
964
- end
965
-
966
- end