[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r10923: fuzz permutations (topf/trunk/lib)



Author: benedikt
Date: 2007-07-24 12:47:27 -0400 (Tue, 24 Jul 2007)
New Revision: 10923

Modified:
   topf/trunk/lib/fuzz.rb
Log:
fuzz permutations

Modified: topf/trunk/lib/fuzz.rb
===================================================================
--- topf/trunk/lib/fuzz.rb	2007-07-24 10:13:46 UTC (rev 10922)
+++ topf/trunk/lib/fuzz.rb	2007-07-24 16:47:27 UTC (rev 10923)
@@ -4,11 +4,16 @@
 
     # This Class holds all tests to related to a given field-type
     class Tests
-        def initialize
+        attr_reader :tests, :permutations
+        def initialize(struct)
             @char_tests      = []
             @unsigned_tests  = []
             @signed_tests    = []
             @octet_tests     = []
+            @permutations    = [] 
+            @tests           = []
+            @struct          = struct
+            @count           = 0
         end
         def register(test)
             raise "argument must be a Fuzz::Test object" if !test.is_a?(Fuzz::Test)
@@ -23,10 +28,78 @@
                     @octet_tests.push test
             end
         end
-        def test_struct(struct)
-            raise "argument must be a BitStruct object" if !struct.is_a?(BitStruct)
-             
+        def generate_test
+            generate_test_data
+            permutate
+            @count = 0
         end
+
+        def get_test
+            raise "no tests have been generated yet" if !@permutations or !@tests
+            test = []
+            perm = @permutations.collect{|element| element[@count] }
+            tempcount = 0
+            @count += 1
+            @tests.collect{ |element| 
+                result = element[ perm[tempcount] ]
+                tempcount+=1
+                result
+            }
+
+        end
+    private
+        def generate_test_data
+            result = []
+            raise "argument must be a BitStruct object" if !@xxxxxxxxxxx?(BitStruct)
+            @struct.fields.each do |field|
+                temp = []
+                arg = @struct.method(field.name).call
+                length = field.length
+                case field.class.to_s
+                when "BitStruct::SignedField"
+                    @signed_tests.each do |test|
+                        temp.push( test.run(arg, length) )
+                    end
+                    result.push(temp)
+                when "BitStruct::UnsignedField"
+                    @unsigned_tests.each do |test|
+                        temp.push( test.run(arg, length) )
+                    end
+                    result.push(temp)
+                when "BitStruct::TextField" || "BitStruct::CharField"
+                    @char_tests.each do |test|
+                        temp.push( test.run(arg, length) )
+                    end
+                    result.push(temp)
+                end
+            end
+            @tests = result
+        end
+        def permutate
+            raise "tests have not been generated yet" if !@tests
+
+            sizes =  @tests.collect {|element| element.size}
+            dimension = sizes.inject(1){|prod, element| prod*element }
+            permutations = Array.new(sizes.size, Array.new(dimension, 1) )
+            result = []
+            permutations.each_with_index do |element, index|
+                count = 0 
+                temp  = 1
+                tempdimension = sizes[(index+1)..-1].inject(1){|prod, el| prod*el}
+                result.push element.collect{|entry|
+                    if count == tempdimension
+                       temp+=1
+                       temp = 1 if temp == (sizes[index]+1) 
+                       
+                       count = 0
+                    end
+                    count+=1
+                    temp  
+                }
+            end
+            @permutations = result
+        end
+
     end
 
     # This Class holds our test which is a ruby-block that must be able to process one argument
@@ -48,8 +121,8 @@
                 end
             @test = block
         end
-        def run(arg)
-                @test.call arg
+        def run(arg, size)
+                @test.call arg, size
         end
     end
     # sample test-case
@@ -203,3 +276,7 @@
         end        
     end 
 end
+
+begin
+    
+end