/[eiffelstudio]/branches/eth/eve/Src/library/testing/etf/interpreter/itp_test_case_serializer.e
ViewVC logotype

Diff of /branches/eth/eve/Src/library/testing/etf/interpreter/itp_test_case_serializer.e

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 88873 by jasonw, Wed May 16 09:04:03 2012 UTC revision 88874 by jasonw, Thu Jun 14 14:25:07 2012 UTC
# Line 36  feature{NONE} -- Initialization Line 36  feature{NONE} -- Initialization
36                          create object_graph_traversor                          create object_graph_traversor
37                          create test_case_hashs.make (2048)                          create test_case_hashs.make (2048)
38                          create state_counts.make (2048)                          create state_counts.make (2048)
39                            state_counts.compare_objects
40                          test_case_hashs.compare_objects                          test_case_hashs.compare_objects
41                          is_post_state_serialized := a_post_state_serialized                          is_post_state_serialized := a_post_state_serialized
42                  ensure                  ensure
# Line 47  feature -- Access Line 48  feature -- Access
48          interpreter: ITP_INTERPRETER          interpreter: ITP_INTERPRETER
49                          -- AutoTest interpreter attached to current serializer                          -- AutoTest interpreter attached to current serializer
50    
51          test_case_hashs: HASH_TABLE [STRING, INTEGER]          test_case_hashs: HASH_TABLE [STRING, STRING]
52                          -- Table of hash codes for test cases seen so far.                          -- Table of hash codes for test cases seen so far.
53                          -- Key is hash code, value is the string representation of that hash code                          -- Key is hash code, value is the string representation of that hash code
54    
55          state_counts: HASH_TABLE [INTEGER, INTEGER]          state_counts: HASH_TABLE [INTEGER, STRING]
56                          -- Table of counts for established pre-states for test cases                          -- Table of counts for established pre-states for test cases
57                          -- Keys are state hash codes, values are the number of times those states have been                          -- Keys are state hash codes, values are the number of times those states have been
58                          -- seen.                          -- seen.
# Line 68  feature -- Access Line 69  feature -- Access
69                          l_index: INTEGER                          l_index: INTEGER
70                          l_object: detachable ANY                          l_object: detachable ANY
71                          l_should_serialize: BOOLEAN                          l_should_serialize: BOOLEAN
                         l_hash: INTEGER  
72                          l_serialization: STRING                          l_serialization: STRING
73                          l_states: STRING                          l_states: STRING
74                          l_state_count: INTEGER                          l_state_count: INTEGER
75                          l_id: STRING                          l_id: STRING
76                            l_state_hash: STRING
77                            l_idx: INTEGER
78                            l_hash: STRING
79                            l_test_case_id: STRING
80                            l_tc_signature: STRING
81                  do                  do
82                          if is_test_case_setup then                          if is_test_case_setup then
83                                  l_hash := test_case_hash_code.hash_code                                  l_hash := test_case_hash_code.twin
84    
85                                    l_idx := l_hash.index_of ('#', 1)
86                                    l_state_hash := l_hash.substring (l_idx + 1, l_hash.count)
87    
88                                    if interpreter.is_failing_test_case then
89                                                    -- For failing test cases, ID = recipient_class.recipient.exception_code.tag
90                                            l_test_case_id := interpreter.last_fault_id
91                                    else
92                                                    -- For passing test cases, ID = class_under_test.feature_under_test.0.noname
93                                            l_test_case_id := l_hash.substring (1, l_idx - 1) + ".0.noname"
94                                    end
95    
96                                    l_tc_signature := l_test_case_id + "#" + l_state_hash
97    
98                                          -- Update state counts.                                          -- Update state counts.
99                                  state_counts.search (l_hash)                                  state_counts.search (l_state_hash)
                                 create l_states.make (1024)  
100                                  if state_counts.found then                                  if state_counts.found then
101                                          l_state_count := state_counts.found_item + 1                                          l_state_count := state_counts.found_item + 1
102                                          state_counts.replace (l_state_count, l_hash)                                          state_counts.replace (l_state_count, l_state_hash)
103                                  else                                  else
104                                          l_state_count := 1                                          l_state_count := 1
105                                          state_counts.force (1, l_hash)                                          state_counts.force (1, l_state_hash)
106                                  end                                  end
107    
108                                    create l_states.make (1024)
109                                  create l_id.make (128)                                  create l_id.make (128)
110                                  l_id.append (class_name)                                  l_id.append (class_name)
111                                  l_id.append_character ('.')                                  l_id.append_character ('.')
112                                  l_id.append (feature_name)                                  l_id.append (feature_name)
113                                  l_id.append_character ('.')                                  l_id.append_character ('.')
114                                  l_id.append_integer (l_hash)                                  l_id.append_integer (l_state_hash.hash_code)
115    
116                                  l_states.append (once "<state>")                                  l_states.append (once "<state>")
117                                  l_states.append (l_id)                                  l_states.append (l_id)
118                                  l_states.append (once " count=")                                  l_states.append (once " count=")
119                                  l_states.append_integer (state_counts.item (l_hash))                                  l_states.append_integer (state_counts.item (l_state_hash))
120                                  l_states.append (once "; fault=")                                  l_states.append (once "; fault=")
121                                  l_states.append_boolean (exception /= Void and then not exception.is_empty)                                  l_states.append_boolean (exception /= Void and then not exception.is_empty)
122                                  l_states.append (once "</state>%N")                                  l_states.append (once "</state>%N")
# Line 114  feature -- Access Line 133  feature -- Access
133    
134                                  l_should_serialize :=                                  l_should_serialize :=
135                                          interpreter.is_duplicated_test_case_serialized or else                                          interpreter.is_duplicated_test_case_serialized or else
136                                          not test_case_hashs.has (l_hash)                                          not test_case_hashs.has (l_tc_signature)
137    
138                                  if not l_should_serialize then                                  if not l_should_serialize then
139                                          l_serialization := ""                                          l_serialization := ""
140                                  else                                  else
141                                          if not interpreter.is_duplicated_test_case_serialized then                                          if not interpreter.is_duplicated_test_case_serialized then
142                                                  test_case_hashs.put (test_case_hash_code, l_hash)                                                  test_case_hashs.put (l_tc_signature, l_tc_signature)
143                                          end                                          end
144    
145                                                  -- Synthesize serialization part for a test case.                                                  -- Synthesize serialization part for a test case.
# Line 140  feature -- Access Line 159  feature -- Access
159                                          append_exception_trace (exception, l_serialization)                                          append_exception_trace (exception, l_serialization)
160    
161                                                  -- Synthesize hash.                                                  -- Synthesize hash.
162                                          append_test_case_hash_code (test_case_hash_code, l_serialization)                                          append_test_case_hash_code (l_tc_signature, l_serialization)
163    
164                                                  -- Synthesize pre-/post-state object summary.                                                  -- Synthesize pre-/post-state object summary.
165                                          append_object_state (pre_state_object_summary, l_serialization, True)                                          append_object_state (pre_state_object_summary, l_serialization, True)
# Line 364  feature{NONE} -- Implementation Line 383  feature{NONE} -- Implementation
383                          -- List of variables in `pre_state_serialization' along with their object index.                          -- List of variables in `pre_state_serialization' along with their object index.
384                          -- Key is variable index, value is the variable object itself in pre-execution state.                          -- Key is variable index, value is the variable object itself in pre-execution state.
385    
386          abstract_object_state (a_pre_state: BOOLEAN): TUPLE [summary: STRING; hash: STRING] is          abstract_object_state (a_pre_state: BOOLEAN): TUPLE [summary: STRING; hash: STRING]
387                          -- Retrieve object state summary from objects specified by `operands'                          -- Retrieve object state summary from objects specified by `operands'
388                          -- `summary' is the state summary for `operands'.                          -- `summary' is the state summary for `operands'.
389                          -- `hash' is the hash code of `summary'.                          -- `hash' is the hash code of `summary'.
# Line 383  feature{NONE} -- Implementation Line 402  feature{NONE} -- Implementation
402                                          l_hash_code.append (class_name)                                          l_hash_code.append (class_name)
403                                          l_hash_code.append_character ('.')                                          l_hash_code.append_character ('.')
404                                          l_hash_code.append (feature_name)                                          l_hash_code.append (feature_name)
405                                          l_hash_code.append_character ('.')                                          l_hash_code.append_character ('#')
406                                  end                                  end
407    
408                                  create l_summary.make (256)                                  create l_summary.make (256)
# Line 406  feature{NONE} -- Implementation Line 425  feature{NONE} -- Implementation
425                                          -- Calculate hash code of current test case for test case duplication detection.                                          -- Calculate hash code of current test case for test case duplication detection.
426                                  if a_pre_state then                                  if a_pre_state then
427                                          l_hash_code.append (hash_code_from_list (interpreter.query_value_hash_list).out)                                          l_hash_code.append (hash_code_from_list (interpreter.query_value_hash_list).out)
428                                    else
429                                            l_hash_code.append ("0")
430                                  end                                  end
431                                  Result := [l_summary, l_hash_code]                                  Result := [l_summary, l_hash_code]
432                          else                          else
# Line 530  feature{NONE} -- Implementation Line 551  feature{NONE} -- Implementation
551                          -- specified by `a_roots'. Result is a list of such referenced object pairs. In each pair, `index' is the                          -- specified by `a_roots'. Result is a list of such referenced object pairs. In each pair, `index' is the
552                          -- variable index in the object pool, `object' is the variable itself.                          -- variable index in the object pool, `object' is the variable itself.
553                          -- Objects specified in `a_roots' are also included in Result.                          -- Objects specified in `a_roots' are also included in Result.
554                          -- A pair [Void, 1] is always included in Result.                          -- A pair [[Void, "NONE"], 1] is always included in Result.
555                  require                  require
556                          a_roots_not_empty: a_roots.count > 0                          a_roots_not_empty: a_roots.count > 0
557                  local                  local
# Line 544  feature{NONE} -- Implementation Line 565  feature{NONE} -- Implementation
565                  do                  do
566                          create l_tbl.make (20)                          create l_tbl.make (20)
567                                  -- Insert [Void, v_1], becuase AutoTest will always set v_1 to Void.                                  -- Insert [Void, v_1], becuase AutoTest will always set v_1 to Void.
568                          l_tbl.put (Void, 1)                          l_tbl.put ([Void, "NONE"], 1)
569    
570                          l_store := interpreter.store                          l_store := interpreter.store
571                          l_traversor := object_graph_traversor                          l_traversor := object_graph_traversor
# Line 560  feature{NONE} -- Implementation Line 581  feature{NONE} -- Implementation
581                                  l_object := l_store.variable_value (l_index)                                  l_object := l_store.variable_value (l_index)
582                                  if l_object /= Void then                                  if l_object /= Void then
583                                                  -- For each root object, recursively traverse the whole object graph.                                                  -- For each root object, recursively traverse the whole object graph.
584                                          if l_object = Void then                                          l_tbl.put ([l_object, l_object.generating_type.name.out], l_index)
                                                 l_tbl.put ([l_object, l_object.generating_type.name.out], l_index)  
                                         else  
                                                 l_tbl.put ([l_object, "NONE"], l_index)  
                                         end  
585                                          l_traversor.wipe_out                                          l_traversor.wipe_out
586                                          l_traversor.set_object_action (agent on_object_visited (?, l_tbl))                                          l_traversor.set_object_action (agent on_object_visited (?, l_tbl))
587                                          l_traversor.set_root_object (l_object)                                          l_traversor.set_root_object (l_object)
588                                          l_traversor.traverse                                          l_traversor.traverse
589                                    else
590                                            l_tbl.put ([Void, "NONE"], l_index)
591                                  end                                  end
592                                  i := i + 1                                  i := i + 1
593                          end                          end
594                          Result := l_tbl                          Result := l_tbl
595                  end                  end
596    
597          on_object_visited (a_object: detachable ANY; a_object_table: HASH_TABLE [detachable ANY, INTEGER])          on_object_visited (a_object: detachable ANY; a_object_table: HASH_TABLE [TUPLE [detachable ANY, STRING], INTEGER])
598                          -- Action to be performed when `a_object' is visited during object graph traversal.                          -- Action to be performed when `a_object' is visited during object graph traversal.
599                          -- If `a_object' is found in the object pool in `interpreter', put it in `a_object_table'.                          -- If `a_object' is found in the object pool in `interpreter', put it in `a_object_table'.
600                          -- Key of `a_object_table' is the object index in the object pool, value is the object itself.                          -- Key of `a_object_table' is the object index in the object pool, value is the object itself.
# Line 588  feature{NONE} -- Implementation Line 607  feature{NONE} -- Implementation
607                                  l_index := l_interpreter.store.variable_index (l_int)                                  l_index := l_interpreter.store.variable_index (l_int)
608                                  if l_index > 0 then                                  if l_index > 0 then
609  --                                      interpreter.log_message ("Serialization: Found an integer%N")  --                                      interpreter.log_message ("Serialization: Found an integer%N")
610                                          a_object_table.put (l_int.item, l_index)                                          a_object_table.put ([l_int.item, l_int.generating_type.out], l_index)
611                                  end                                  end
612                          elseif attached {BOOLEAN} a_object as l_bool then                          elseif attached {BOOLEAN} a_object as l_bool then
613                                  l_index := l_interpreter.store.variable_index (l_bool)                                  l_index := l_interpreter.store.variable_index (l_bool)
614                                  if l_index > 0 then                                  if l_index > 0 then
615  --                                      interpreter.log_message ("Serialization: Found boolean%N")  --                                      interpreter.log_message ("Serialization: Found boolean%N")
616                                          a_object_table.put (l_bool.item, l_index)                                          a_object_table.put ([l_bool.item, l_bool.generating_type.out], l_index)
617                                    end
618                            elseif attached{INTEGER_8} a_object as l_int8 then
619                                    l_index := l_interpreter.store.variable_index (l_int8)
620                                    if l_index > 0 then
621                                            a_object_table.put ([l_int8.item, l_int8.generating_type.out], l_index)
622                                    end
623                            elseif attached{INTEGER_16} a_object as l_int16 then
624                                    l_index := l_interpreter.store.variable_index (l_int16)
625                                    if l_index > 0 then
626                                            a_object_table.put ([l_int16.item, l_int16.generating_type.out], l_index)
627                                    end
628                            elseif attached{INTEGER_64} a_object as l_int64 then
629                                    l_index := l_interpreter.store.variable_index (l_int64)
630                                    if l_index > 0 then
631                                            a_object_table.put ([l_int64.item, l_int64.generating_type.out], l_index)
632                                    end
633                            elseif attached{NATURAL_8} a_object as l_nat8 then
634                                    l_index := l_interpreter.store.variable_index (l_nat8)
635                                    if l_index > 0 then
636                                            a_object_table.put ([l_nat8.item, l_nat8.generating_type.out], l_index)
637                                    end
638                            elseif attached{NATURAL_16} a_object as l_nat16 then
639                                    l_index := l_interpreter.store.variable_index (l_nat16)
640                                    if l_index > 0 then
641                                            a_object_table.put ([l_nat16.item, l_nat16.generating_type.out], l_index)
642                                    end
643                            elseif attached{NATURAL_32} a_object as l_nat32 then
644                                    l_index := l_interpreter.store.variable_index (l_nat32)
645                                    if l_index > 0 then
646                                            a_object_table.put ([l_nat32.item, l_nat32.generating_type.out], l_index)
647                                    end
648                            elseif attached{NATURAL_64} a_object as l_nat64 then
649                                    l_index := l_interpreter.store.variable_index (l_nat64)
650                                    if l_index > 0 then
651                                            a_object_table.put ([l_nat64.item, l_nat64.generating_type.out], l_index)
652                                    end
653                            elseif attached{CHARACTER_8} a_object as l_char8 then
654                                    l_index := l_interpreter.store.variable_index (l_char8)
655                                    if l_index > 0 then
656                                            a_object_table.put ([l_char8.item, l_char8.generating_type.out], l_index)
657                                    end
658                            elseif attached{CHARACTER_32} a_object as l_char32 then
659                                    l_index := l_interpreter.store.variable_index (l_char32)
660                                    if l_index > 0 then
661                                            a_object_table.put ([l_char32.item, l_char32.generating_type.out], l_index)
662                                    end
663                            elseif attached{REAL_32} a_object as l_real32 then
664                                    l_index := l_interpreter.store.variable_index (l_real32)
665                                    if l_index > 0 then
666                                            a_object_table.put ([l_real32.item, l_real32.generating_type.out], l_index)
667                                    end
668                            elseif attached{REAL_64} a_object as l_real64 then
669                                    l_index := l_interpreter.store.variable_index (l_real64)
670                                    if l_index > 0 then
671                                            a_object_table.put ([l_real64.item, l_real64.generating_type.out], l_index)
672                                  end                                  end
673    --                      elseif attached{POINTER} a_object as l_ptr then
674    --                              l_index := l_interpreter.store.variable_index (l_ptr)
675    --                              if l_index > 0 then
676    --                                      a_object_table.put ([l_ptr.item, l_ptr.generating_type.out], l_index)
677    --                              end
678    
679                          else                          else
680                                  l_index := l_interpreter.store.variable_index (a_object)                                  l_index := l_interpreter.store.variable_index (a_object)
681                                  if l_index > 0 then                                  if l_index > 0 then
682                                          a_object_table.put (a_object, l_index)                                          if a_object = Void then
683                                                    a_object_table.put ([Void, "NONE"], l_index)
684                                            else
685                                                    a_object_table.put ([a_object, a_object.generating_type.out], l_index)
686                                            end
687    
688                                  end                                  end
689                          end                          end
690                  end                  end

Legend:
Removed from v.88873  
changed lines
  Added in v.88874

  ViewVC Help
Powered by ViewVC 1.1.23