require_relative 'find_algos' require_relative 'sorting_algos' require_relative 'Type' require_relative 'functional_functions' require_relative 'Filter' # Hi! Steffan was here... container_obj = "ferries" def construct_class(name_of_class, parameters, to_string_template) sorting_one = Type.new("String", "Name") sorting_two = Type.new("int", "Length") sorting_three = Type.new("int", "Width") sorting_two.comparator = ">" sorting_three.comparator = ">" sorting_string = compare_to_three_vars(sorting_one, sorting_two, sorting_three) fields = "" parameters.each do |x| fields += "private #{x[:type]} #{x[:name]}; \n" end tmptmp = parameters.map { |x| "#{x[:type]} #{x[:name]}"} constructor_parameters = tmptmp.join "," lel = parameters.map do |x| "public #{x[:type]} get#{x[:name]}(){ return #{x[:name]}; }" end getters = lel.join "\n" lol = parameters.map do |x| "this.#{x[:name]} = #{x[:name]};" end (0...parameters.length).each do |x| pls = '" + ' pls += parameters[x][:name] pls += '+ "' to_string_template.sub! "#{x}", pls end " public class #{name_of_class} implements Comparable<#{name_of_class}> { #{fields} public #{name_of_class}(#{constructor_parameters}) { #{lol.join("\n")} } #{getters} public String toString() { return " + '"' + "#{to_string_template}" + '"' + "; } public int compareTo(#{name_of_class} other) { #{sorting_string} } } " end def construct_driver(class_name, parameters, methods, container_class, container_params) def args(parameters) tmp = parameters.map do |x| type = x[:type] res_string = "" if type == "int" res_string += "#{rand(max=100)}" else res_string += '"' + (0...10).map { ('a'..'z').to_a[rand(26)] }.join + '"' end res_string end tmp.join "," end methods_to_print = "" maggie = methods.map do |x| if x[:print] " System.out.println(lol.#{x[:name]}(#{args x[:parameters]})); " else "lol.#{x[:name]}(#{args x[:parameters]});" end end driver_string = " public class TestDriver { public TestDriver(){} public static void test() { var tmp1 = new #{class_name}(#{args parameters}); var tmp2 = new #{class_name}(#{args parameters}); var tmp3 = new #{class_name}(#{args parameters}); var tmp4 = new #{class_name}(#{args parameters}); var tmp5 = new #{class_name}(#{args parameters}); System.out.println(tmp1); System.out.println(tmp2); System.out.println(tmp3); System.out.println(tmp4); System.out.println(tmp5); #{container_class} lol = new #{container_class}(#{args container_params}); lol.add#{class_name}(tmp1); lol.add#{class_name}(tmp2); lol.add#{class_name}(tmp3); lol.add#{class_name}(tmp4); lol.add#{class_name}(tmp5); System.out.println(\"\"); System.out.println(\"Some checkpoint\"); #{maggie.join "\n\n System.out.println(\"Some Checkpoint\"); \n\n"} } public static void main(String[] args) { TestDriver.test(); } } " end def construct_container(name, parameters, given_fields, methods, arraylist_name) fields = "" parameters.each do |x| fields += "private #{x[:type]} #{x[:name]};\n" end given_fields.each do |x| fields += " private #{x[:type]} #{x[:name]};\n" end maggie = methods.map do |x| " public #{x[:return_type]} #{x[:name]} (#{x[:params].map {|y| "#{y[:type]} #{y[:name]}"}.join ","}) { #{x[:method_type]} } " end construtor_params = parameters.map do |x| "#{x[:type]} #{x[:name]}" end constructor_handlers = parameters.map do |x| print(x[:name]) "this.#{x[:name]} = #{x[:name]};" end container_string = " import java.util.*; import java.util.stream.Collectors; public class #{name} { #{fields} public #{name}(#{construtor_params.join ","}) { #{constructor_handlers.join "\n"} this.#{arraylist_name} = new ArrayList<>(); } #{maggie.join "\n"} public void print#{name}() { System.out.println(\"#{name}\"); Collections.sort(#{arraylist_name}); for (var i : #{arraylist_name}) { System.out.println(i); } } } " container_string end name = "Ferry" file = File.open("#{name}.java", "w") params = [{:type => "String", :name => "Name"}, {:type => "int", :name => "Length"}, {:type => "int", :name => "Width"}] file.puts(construct_class name, params, "0 1 x 2 meter") file.close container_methods = [ { :return_type => "void", :name => "addFerry", :params => [{ :type => "Ferry", :name => "f" }], :method_type => add_method(container_obj, "f") }, { :return_type => "ArrayList", :name => "smallFerries", :params => [{ :type => "int", :name => "maxLength" }], :method_type => find_all(container_obj, "Length", " < ", "#{name}", "maxLength") }, { :return_type => "#{name}", :name => "longFerry", :params => [{ :type => "String", :name => "Name" }], :method_type => find_best_with_extra_parameter(container_obj, "Length", " > ", "#{name}", "Name", ".equals", "Name", "int") }, { :return_type => "List<#{name}>", :name => "findFerries", :params => [{ :type => "int", :name => "min", }, { :type => "int", :name => "max" }], :method_type => func_find_all(container_obj, "Width", [Filter.new("min", ">="), Filter.new("max", "<=")]) }, { :return_type => "int", :name => "findLength", :params => [{ :type => "String", :name => "Name" }], :method_type => find_whatever_of_variable(container_obj, "Name", [Filter.new("Name", "==")], "sum", "Length") } ] container_class = "Harbour" another_another_file = File.open("#{container_class}.java", "w") another_another_file.puts(construct_container(container_class, [{:type => "String", :name => "Name"}], [ {:type => "ArrayList<#{name}>", :name => container_obj}], container_methods, container_obj)) another_another_file.close # TODO: When creating find algorithms, remember to add a space or two (lol for consistency) for <, >, <=, >= another_file = File.open("TestDriver.java", "w") another_file.puts(construct_driver name, params, [{:name => "smallFerries", :parameters => [{:type => "int"}], :print => true}, {:name => "longFerry", :parameters => [{:type => "String"}], :print => true}, {:name => "printHarbour", :parameters => [], :print => false}, {:name => "findFerries", :parameters => [{:type => "int"}, {:type => "int"}], :print => true }, {:name => "findLength", :parameters => [{:type => "String"}], :print => true}], "Harbour", [{:type => "String"}]) another_file.close `javac *.java` `java TestDriver`