test_multilocus.rb 15.7 KB
Newer Older
1
# coding: utf-8
2
load 'vidjil_browser.rb'
3
load 'browser_test.rb'
Marc Duez's avatar
Marc Duez committed
4

5
#browser test suite
6
class TestMultilocus < BrowserTest
7
8

  def setup
9
    super
Mikaël Salson's avatar
Mikaël Salson committed
10
    if not defined? $b
11
      set_browser("/doc/analysis-example.vidjil")
12
13
14
      if $b.div(id: 'tip-container').present?
        $b.div(:id => 'tip-container').div(:class => 'tip_1').element(:class => 'icon-cancel').click
      end
Mikaël Salson's avatar
Mikaël Salson committed
15
    end
16
17
  end

18

19
  def after_tests
20
  end
Mikaël Salson's avatar
Mikaël Salson committed
21
  
22
  def test_00_info_segmentation
23
    assert ($b.div(:id => 'info_segmented').text.include?  '742 377 (94.35%)'), ' Incorrect number of segmented reads'
24
  end
Marc Duez's avatar
Marc Duez committed
25

Marc Duez's avatar
Marc Duez committed
26

27
  def test_00_info_reads
28
    assert ($b.div(:id => 'info_segmented').title.include? '786 861'), 'Incorrect number of reads'
29
30
31
  end

  def test_00_default_point_name
Marc Duez's avatar
Marc Duez committed
32
    assert ($b.div(:id => 'info_point').text.include? 'helloworld'), 'Incorrect point name in info box'
33
34
35
  end

  def test_00_germline
36
    assert ($b.div(:id => 'info').span(:class => 'systemBoxNameMenu', :index => 0).text.include? 'TRA'), 'missing system TRA'
37
38
39
  end

  def test_00_legend_scatterplot
Marc Duez's avatar
Marc Duez committed
40
41
42
43
    assert ($b.scatterplot_x_legend(0).text == 'TRBV1'), "Bad legend for scatterplot"
    assert ($b.scatterplot_x_legend(4).text == '?'), "Bad legend for scatterplot"
    assert ($b.scatterplot_y_legend(0).text == 'TRBJ1-1'), "Bad legend for scatterplot"
    assert ($b.scatterplot_y_legend(9).text == '?'), "Bad legend for scatterplot"
44
  end
Marc Duez's avatar
Marc Duez committed
45

46
  def test_00_info_point
47
    assert (not $b.div(:id => 'info_timepoint').present?), "Info timepoint should not be present"
48
    $b.info_point.i.click
Mikaël Salson's avatar
Mikaël Salson committed
49
    assert ($b.div(:id => 'info_timepoint').present?), "After clicking info timepoint should be visible"
50
51

    table = $b.div(:id => 'info_timepoint').table
Marc Duez's avatar
Marc Duez committed
52
53
    assert (table[1][1].text == '786861'), "Incorrect  number of reads in infopoint"
    assert (table[2][1].text.include? '742377'), "Incorrect  number of reads in infopoint"
54
    $b.div(:class => 'data-container').span(:class => 'closeButton').click
Marc Duez's avatar
Marc Duez committed
55
    assert (not $b.div(:id => 'info_timepoint').present?), "Info timepoint should not be present"
56
  end
Marc Duez's avatar
Marc Duez committed
57

Mikaël Salson's avatar
Mikaël Salson committed
58
  def test_01_init
Marc Duez's avatar
Marc Duez committed
59
60
61
62

      assert ( $b.clone_in_list('25').exists?), ">>fail init : clone 0 missing in list"
      assert ( $b.clone_in_scatterplot('25').exists?), ">>fail init : clone 0 missing in scatterplot"
      #assert ( $b.clone_in_graph('25').exists?), ">>fail init : clone 0 missing in graph"
63
      assert ( $b.clone_in_list('25').text.include? '0.129%' ) , ">>fail init : wrong clone size "
Marc Duez's avatar
Marc Duez committed
64

Mikaël Salson's avatar
Mikaël Salson committed
65
  end
66

Mikaël Salson's avatar
Mikaël Salson committed
67
68
69
70
71
72
73
  def test_02_fold_left_menu
    assert ($b.div(:id => "left-container").present?), ">> fail : left menu should be visible"
    $b.div(:id => "vertical-separator").click
    assert (not $b.div(:id => "left-container").present?), ">> fail : left menu is still visible"
    $b.div(:id => "vertical-separator").click
    assert ($b.div(:id => "left-container").present?), ">> fail : left menu did not reappear"
  end
74

75
76
77
78
  def test_02_export_align_sequences
    assert ( $b.menu_item_export_fasta_align(:class => 'disabledClass').exists?), ">> export align sequences is disable by default"
  end

Mikaël Salson's avatar
Mikaël Salson committed
79
  def test_03_rename_clone_by_clicking
Marc Duez's avatar
Marc Duez committed
80
    clone_name = $b.clone_info('25')[:name]
81
82
    assert (clone_name.title == 'TRBV29*01 -1/0/-0 TRBD1*01 -2/0/-5 TRBJ2-5*01'), " >> clone name is not correct : " + clone_name.title
    assert (clone_name.text == 'TRBV29 1//0 D1 2//5 J2-5'), " >> clone short name is not correct : " + clone_name.text
Mikaël Salson's avatar
Mikaël Salson committed
83
    clone_name.double_click
84

85
    $b.clone_name_editor.set 'renamed_click'
Mikaël Salson's avatar
Mikaël Salson committed
86
    $b.clone_name_saver.click
87
    assert (clone_name.text == 'renamed_click'), " >> clone name (click) has not changed"
88
89

    $b.unselect
Mikaël Salson's avatar
Mikaël Salson committed
90
  end
91

Mikaël Salson's avatar
Mikaël Salson committed
92
  def test_04_rename_clone_by_enter
93
    sleep 1
94
    clone_name = $b.clone_info('24')[:name]
Mikaël Salson's avatar
Mikaël Salson committed
95
    clone_name.double_click
96

97
    $b.clone_name_editor.set 'renamed_return'
Mikaël Salson's avatar
Mikaël Salson committed
98
    $b.send_keys :return
99
    assert (clone_name.text == 'renamed_return'), " >> clone name (return) has not changed"
100

Mikaël Salson's avatar
Mikaël Salson committed
101
102
    $b.unselect
  end
103

Mikaël Salson's avatar
Mikaël Salson committed
104
  def check_when_list_or_scatterplot_focused
Marc Duez's avatar
Marc Duez committed
105
106
    assert ( $b.clone_in_scatterplot('25', :class => 'circle_focus').exists?), ">> fail to focus correct plot after hovering a clone in the list"
    assert ( $b.clone_in_graph('25', :class => "graph_focus").exists?), ">> fail to focus correct graphLine after hovering a clone in the list"
107

Marc Duez's avatar
Marc Duez committed
108
    clone_name = $b.clone_info('25')[:name]
109
    assert ( $b.infoline.inner_html == clone_name.title), ">> Clone name is not correct in focus div"
Mikaël Salson's avatar
Mikaël Salson committed
110
  end
Marc Duez's avatar
Marc Duez committed
111

Mikaël Salson's avatar
Mikaël Salson committed
112
113
114
115
  def test_05_focus_in_list
    begin
      $b.unselect
      #test hover a clone in the list
Mikaël Salson's avatar
Mikaël Salson committed
116
      $b.clone_in_scatterplot('25').wait_until(&:present?)
Marc Duez's avatar
Marc Duez committed
117
      $b.clone_in_list('25').hover
Mikaël Salson's avatar
Mikaël Salson committed
118
119

      check_when_list_or_scatterplot_focused
Marc Duez's avatar
Marc Duez committed
120
    end
Mikaël Salson's avatar
Mikaël Salson committed
121
  end
122

Mikaël Salson's avatar
Mikaël Salson committed
123
124
125
  def test_05_focus_in_scatterplot
    begin
      $b.unselect
Mikaël Salson's avatar
Mikaël Salson committed
126
      $b.clone_in_scatterplot('25').wait_until(&:present?)
Marc Duez's avatar
Marc Duez committed
127
      $b.clone_in_scatterplot('25').hover
128

Mikaël Salson's avatar
Mikaël Salson committed
129
      check_when_list_or_scatterplot_focused
130
    end
Mikaël Salson's avatar
Mikaël Salson committed
131
  end
132

Mikaël Salson's avatar
Mikaël Salson committed
133
  def check_when_list_or_scatterplot_clicked
Marc Duez's avatar
Marc Duez committed
134
    clone_name = $b.clone_info('25')[:name]
135
    assert ( $b.infoline.inner_html == clone_name.title), ">> Clone name is not correct in focus div"
136
    assert ( $b.clone_in_list('25').class_name.include? "list_select" ), ">> Incorrect class name, clone is not selected"
Marc Duez's avatar
Marc Duez committed
137
138
139
    assert ( $b.clone_in_scatterplot('25', :class => "circle_select").exists?)
    assert ( $b.clone_in_graph('25', :class=> "graph_select").exists?)
    assert ( $b.clone_in_segmenter('25').exists? ), ">> fail to add clone to segmenter by clicking on the list or scatterplot"
140

Mikaël Salson's avatar
Mikaël Salson committed
141
142
    stats = $b.statsline
    assert (stats.text.include? '1 clone'), ">> Incorrect stats, should have one clone"
Marc Duez's avatar
Marc Duez committed
143
    assert (stats.text.include? '962 reads'), ">> Incorrect stats, should have 962 reads"
144
    assert (stats.text.include? '0.129%'), ">> Incorrect stats, should be at 0.129%"
Mikaël Salson's avatar
Mikaël Salson committed
145
  end
146

Mikaël Salson's avatar
Mikaël Salson committed
147
148
  def test_08_click_in_list
    #test select a clone in the list
Mikaël Salson's avatar
Mikaël Salson committed
149
    $b.clone_in_scatterplot('25').wait_until(&:present?)
Marc Duez's avatar
Marc Duez committed
150
    $b.clone_info('25')[:name].click()
151

Mikaël Salson's avatar
Mikaël Salson committed
152
    check_when_list_or_scatterplot_clicked
153

Mikaël Salson's avatar
Mikaël Salson committed
154
    $b.unselect
155
    assert (not $b.clone_in_list('25').class_name.include? "list_select"), ">> Incorrect class name, clone is not unselected'"
Mikaël Salson's avatar
Mikaël Salson committed
156
  end
157

Mikaël Salson's avatar
Mikaël Salson committed
158
  def test_08_click_in_scatterplot
Mikaël Salson's avatar
Mikaël Salson committed
159
    $b.clone_in_scatterplot('25').wait_until(&:present?)
Marc Duez's avatar
Marc Duez committed
160
    $b.clone_in_scatterplot('25').click
161

Mikaël Salson's avatar
Mikaël Salson committed
162
    check_when_list_or_scatterplot_clicked
163

Mikaël Salson's avatar
Mikaël Salson committed
164
    $b.unselect
165
    assert (not $b.clone_in_list('25').class_name.include? "list_select"), ">> Incorrect class name, clone is not unselected'"
Mikaël Salson's avatar
Mikaël Salson committed
166
  end
Marc Duez's avatar
Marc Duez committed
167

168
  def test_09_normalize
Marc Duez's avatar
Marc Duez committed
169
    $b.clone_info('25')[:star].click
Mikaël Salson's avatar
Mikaël Salson committed
170
    $b.tag_selector_edit_normalisation.wait_until(&:present?)
Mikaël Salson's avatar
Mikaël Salson committed
171
172
    $b.tag_selector_edit_normalisation.set('0.01')
    $b.tag_selector_normalisation_validator.click 
173
    
Marc Duez's avatar
Marc Duez committed
174
    assert ( $b.clone_info('25')[:size].text == '1.000%' ) , ">> fail normalize on : wrong clone size "
175
    
Mikaël Salson's avatar
Mikaël Salson committed
176
177
    $b.menu_settings.click 
    $b.radio(:id => 'reset_norm').click
178
    assert ( $b.clone_info('25')[:size].text == '0.129%' ) , ">> fail normalize off : wrong clone size "
179
180

    $b.unselect
Mikaël Salson's avatar
Mikaël Salson committed
181
182
  end

183
  def test_0a_shortcuts_numpad
Mikaël Salson's avatar
Mikaël Salson committed
184
    $b.clone_in_scatterplot('25').wait_until(&:present?)
185
186
    $b.clone_in_scatterplot('25').click

Mathieu Giraud's avatar
Mathieu Giraud committed
187
    assert ($b.preset_selector.selected? "[0] V/J (genes)"), ">> preset selector badly set"
188
    $b.send_keys :numpad2
Mathieu Giraud's avatar
Mathieu Giraud committed
189
    assert ($b.preset_selector.selected? "[2] V/N length"), ">> preset selector not properly changed"
190
191
  end

Mikaël Salson's avatar
Mikaël Salson committed
192
193
  def test_12_tag
    begin
Marc Duez's avatar
Marc Duez committed
194
      $b.clone_info('25')[:star].click
195
      name = $b.tag_item('0')[:name]
Mikaël Salson's avatar
Mikaël Salson committed
196
      name.wait_until(&:present?)
197
      name.click
Mikaël Salson's avatar
Mikaël Salson committed
198
      name.wait_while(&:present?)
199

Marc Duez's avatar
Marc Duez committed
200
      assert ($b.clone_info('25')[:name].style('color') ==  'rgba(220, 50, 47, 1)' ) , ">> fail tag : clone color hasn't changed"
Marc Duez's avatar
Marc Duez committed
201
    end
Mikaël Salson's avatar
Mikaël Salson committed
202
  end
203
204
205
206
207

  def test_13_export_fasta
    $b.clone_in_scatterplot('77').click
    $b.clone_in_scatterplot('25').click(:control)
    $b.clone_in_scatterplot('88').click(:control)
208
    $b.clone_in_scatterplot('90').click(:control)
209
210

    $b.menu_item_export_fasta.click
211
212
213
    assert ( $b.window(:url => /about:blank/ )) , ">> fail opening fasta export "
    $b.window(:url => /about:blank/).use do
      assert ($b.text.include? ">TRBV29*01 -1/0/-0 TRBD1*01 -2/0/-5 TRBJ2-5*01"), "header name: "+$b.text
214
      assert ($b.text.include? "YYGGGYYACGYAYAGCGGYGYTTYYCCTYTYTGYTYTGCYAAAYAACYYYYTGTGYCTYTGTGCYGYGTTYCCCGGYYYAAACYCYCYYCCTYGG\nCYAGGYCYGG"), "sequence"
215
      assert ($b.text.include? ">ERG-4F 0/TCT/0 ERG-Seq-R"), "header name locus ERG"
216
      assert (not $b.text.include? ">ERG-4F\n"), "header name of segment should not exist (segment is not present in germline)"
217
218
219
    end
  end

220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
  def test_14_export_sample_report

    assert ($b.scatterplot_x_legend(0).text.include? 'TRB'), "Current system should be TRB"

    # Select a clone
    $b.clone_in_scatterplot('43').click

    $b.menu_item_export('export_sample_report').click

    assert ($b.window(:title => "analysis-example.vidjil – helloworld").exists?), ">> Report didn't show up"

    $b.window(:title => "analysis-example.vidjil – helloworld").use do
      # Check that all loci are there
      assert ($b.element(:id => 'segmentation-report').text.include? "TRA"), "TRA should be present"
      assert ($b.element(:id => 'segmentation-report').text.include? "TRB"), "TRB should be present"
      assert ($b.element(:id => 'segmentation-report').text.include? "TRD"), "TRD should be present"
      assert ($b.element(:id => 'segmentation-report').text.include? "IGH"), "IGH should be present"
      assert (not $b.element(:id => 'segmentation-report').text.include? "TRG"), "TRG should not be present"
      assert (not $b.element(:id => 'segmentation-report').text.include? "IGH+"), "IGH+ should not be present"
      assert ($b.element(:class => 'clone_name').text.include? "TRBV13-1*02 -0/1/-0 TRBD1*01 -6/0/-0 TRBJ1-3*01"), "segmentation should be the one provided in the .vidjil file"

      n_gene = $b.element(:class => 'n_gene', :index => 0)
      # This is true with a 0-based index, which is the case for the vidjil
      # JSON version used
      assert (n_gene.text == 'A'), ("N1 should be A, it is '" + n_gene.text + "'")

      n_gene = $b.element(:class => 'n_gene', :index => 1)
      assert (n_gene.text == ''), ("N2 should be empty, it is '" + n_gene.text + "'")

      assert($b.element(:class => 'j_gene').text == 'YYGYYTYYAATGTYCYYCCYAG')
      assert($b.element(:class => 'v_gene').text == 'YTYTYAYTGGTGCTGGYACCTYAAAYGYYTGYCCTYTGGGYYAGGCYCYYAYACGYAYAYCTYTYCYCTGCTGYATTGGCTYYCCYYAYYYTTTGYCTYTGTGCYGYGTYTGCGGYYTYTGYAAYCGCYYTTTTGYYAGYAGCCGGCY')
    end
    $b.window(:title => "analysis-example.vidjil – helloworld").close

    $b.window(:title => "analysis-example").use

    assert ($b.scatterplot_x_legend(0).text.include? 'TRB'), "Current system should not have changed"

    assert (not $b.element(:class => 'waiting_msg').present?), "The ``generating report'' message should not be present anymore"
  end

261
262
263
264
265
266
  def test_15_smaller_clones
    for i in 0..3
      smaller = $b.list.li(:index => i)

      assert (smaller.text.include?("smaller clones")), "We should have smaller clones at index %d of the list, instead we have %s " % [i, smaller.text]

Mikaël Salson's avatar
Mikaël Salson committed
267
      assert (smaller.present?), "Smaller clones #%d should be visible, it is not" % [i]
268
      smaller.hover
Mikaël Salson's avatar
Mikaël Salson committed
269
      assert (smaller.present?), "Smaller clones #%d should still be visible after hovering it" % [i]
270

Mikaël Salson's avatar
Mikaël Salson committed
271
      assert (not $b.clone_in_scatterplot(smaller.id).present?), "Smaller clone %d should not be visible in scatterplot" % [i]
272
273
274
    end
  end

275
276
277
278
279
280
  def test_16_select_unsegmented
    clone_id = '10'
    $b.clone_in_scatterplot(clone_id).click

    assert ($b.clone_in_segmenter(clone_id).exists?), "Clone %s is not in segmenter" % clone_id
  end
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313

  def test_17_select_clustered
    $b.clone_in_scatterplot('1').click
    $b.clone_in_scatterplot('37').click(:control)
    $b.clone_in_scatterplot('90').click(:control)

    $b.merge.click

    assert ($b.clone_in_scatterplot('90').exists?), "Main clone of the cluster should be clone 90"
    assert ($b.clone_in_scatterplot('90', :class => "circle_select").exists?), "Clone should be selected"

    $b.clone_info('90')[:cluster].click

    assert ( $b.clone_in_scatterplot('1', :class => "circle_select").exists?)
    assert ( $b.clone_in_graph('1', :class=> "graph_select").exists?)
    assert ( $b.clone_in_segmenter('1').exists? ), ">> fail to add clone to segmenter by clicking on the list or scatterplot"
    assert ( $b.clone_in_scatterplot('37', :class => "circle_select").exists?)
    assert ( $b.clone_in_graph('37', :class=> "graph_select").exists?)
    assert ( $b.clone_in_segmenter('37').exists? ), ">> fail to add clone to segmenter by clicking on the list or scatterplot"
    assert ( $b.clone_in_scatterplot('90', :class => "circle_select").exists?)
    assert ( $b.clone_in_graph('90', :class=> "graph_select").exists?)
    assert ( $b.clone_in_segmenter('90').exists? ), ">> fail to add clone to segmenter by clicking on the list or scatterplot"

    $b.clone_in_cluster('90', '1')[:delete].click
    $b.clone_in_cluster('90', '37')[:delete].click

    $b.unselect

    assert ($b.clone_in_scatterplot('1').exists?)
    assert ($b.clone_in_scatterplot('37').exists?)
    assert ($b.clone_in_scatterplot('90').exists?)

  end
314
315
316

  def test_18_empty_clone_invisible
    assert ( $b.execute_script("return m.clones[66].reads[0]") == 0), "Clone should have no read"
Mikaël Salson's avatar
Mikaël Salson committed
317
    assert (not $b.clone_in_scatterplot('66').present?), "Clone should not be visible"
318
  end
Mikaël Salson's avatar
Mikaël Salson committed
319

320
  def TODO_test_14_edit_tag
Mikaël Salson's avatar
Mikaël Salson committed
321
    begin
Mathieu Giraud's avatar
Mathieu Giraud committed
322
      ## rename Tag 0
Marc Duez's avatar
Marc Duez committed
323
      $b.clone_info('25')[:star].click
Mathieu Giraud's avatar
Mathieu Giraud committed
324

Mikaël Salson's avatar
Mikaël Salson committed
325
      edit = $b.tag_item('0')[:edit]
Mikaël Salson's avatar
Mikaël Salson committed
326
      edit.wait_until(&:present?)
Mikaël Salson's avatar
Mikaël Salson committed
327
      edit.click
Mathieu Giraud's avatar
Mathieu Giraud committed
328
      $b.tag_selector_edit_name.set 'renamed_click'
Mikaël Salson's avatar
Mikaël Salson committed
329
330
      $b.tag_selector_name_validator.click

Mathieu Giraud's avatar
Mathieu Giraud committed
331
332
333
334
335
336
337
      $b.tag_selector_close.click
      $b.tag_selector.wait_while_present

      ## rename Tag 1 (on another clone)
      $b.clone_info('24')[:star].click

      edit = $b.tag_item('1')[:edit]
Mikaël Salson's avatar
Mikaël Salson committed
338
      edit.wait_until(&:present?)
Marc Duez's avatar
Marc Duez committed
339
      edit.click
Mathieu Giraud's avatar
Mathieu Giraud committed
340
      $b.tag_selector_edit_name.set 'renamed_return'
Mikaël Salson's avatar
Mikaël Salson committed
341
      $b.send_keys :return
Marc Duez's avatar
Marc Duez committed
342

Mikaël Salson's avatar
Mikaël Salson committed
343
      $b.tag_selector_close.click
Mathieu Giraud's avatar
Mathieu Giraud committed
344
      $b.tag_selector.wait_while_present
Marc Duez's avatar
Marc Duez committed
345

Mathieu Giraud's avatar
Mathieu Giraud committed
346
347
348
      ## check renames (on again another clone)
      $b.clone_info('23')[:star].click
      edit = $b.tag_item('1')[:edit]
Mikaël Salson's avatar
Mikaël Salson committed
349
      edit.wait_until(&:present?)
Mathieu Giraud's avatar
Mathieu Giraud committed
350
351
352
353
354
355

      assert ($b.tag_selector.text.include? 'renamed_click'),  "fail edit tag with mouse : tag name in tag selector hasn't changed"
      assert ($b.tag_selector.text.include? 'renamed_return'), "fail edit tag with keyboard : tag name in tag selector hasn't changed"

      $b.tag_selector_close.click
      $b.tag_selector.wait_while_present
356
    end
Mikaël Salson's avatar
Mikaël Salson committed
357
  end
Marc Duez's avatar
Marc Duez committed
358

359
360
361
362
363
364
365
366
367
368

  def test_19_edit_tag
    begin
      $b.clone_in_scatterplot('77').click
      $b.clone_in_scatterplot('25').click(:control)
      $b.clone_in_scatterplot('88').click(:control)
      $b.clone_in_scatterplot('90').click(:control)
      
      ## Test tag selection for one clone
      $b.clone_info('25')[:star].click
369
      $b.element(:id => 'tagElem_0').click
370
371
372
373
374
375

      assert ($b.clone_info('25')[:name].style('color') ==  'rgba(220, 50, 47, 1)' ) , "clone 25 have changed color"
      assert ( not $b.clone_info('88')[:name].style('color') ==  'rgba(220, 50, 47, 1)' ) , "clone 88 (second of the selection) haven't chaged color "


      ## Test tag selection for multiple clone
376
377
      $b.element(:id => "tag_icon__multiple").click
      $b.element(:id => 'tagElem_6').click
378
379
380
381
382
383
      assert ($b.clone_info('25')[:name].style('color') ==  'rgba(211, 54, 130, 1)' ) , "clone 25 have also changed color"
      assert ($b.clone_info('77')[:name].style('color') ==  'rgba(211, 54, 130, 1)' ) , "clone 77 have also changed color"
      assert ($b.clone_info('88')[:name].style('color') ==  'rgba(211, 54, 130, 1)' ) , "clone 88 have also changed color"
    end
  end

384
385
386
  # Not really a test
  def test_zz_close
    close_everything
Mikaël Salson's avatar
Mikaël Salson committed
387
  end
Marc Duez's avatar
Marc Duez committed
388
389
end

Marc Duez's avatar
Marc Duez committed
390
391
392
393
394
395
396
397
398
399
400
401
402
=begin
    TODO
    save_analysis
    clipboard
    edit tag
    change axis scatterplot
    edit name
    change color method
    change color palette
    change scatterplot/graph size
    
    check x/y clone position on scatterplot
    check clone path 
403
=end