laser 0.7.0.pre1
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.
- data/.document +5 -0
- data/.rspec +1 -0
- data/Gemfile +14 -0
- data/LICENSE +661 -0
- data/README.md +158 -0
- data/Rakefile +104 -0
- data/VERSION +1 -0
- data/bin/laser +7 -0
- data/design_docs/goals.md +57 -0
- data/design_docs/object_regex.md +426 -0
- data/design_docs/type_annotations.md +80 -0
- data/ext/laser/BasicBlock.cpp +572 -0
- data/ext/laser/BasicBlock.h +118 -0
- data/ext/laser/extconf.rb +3 -0
- data/features/laser.feature +25 -0
- data/features/step_definitions/laser_steps.rb +39 -0
- data/features/support/env.rb +14 -0
- data/features/support/testdata/1_input +1 -0
- data/features/support/testdata/1_output +1 -0
- data/features/support/testdata/2_input +4 -0
- data/features/support/testdata/2_output +4 -0
- data/features/support/testdata/3_input +8 -0
- data/features/support/testdata/3_output +11 -0
- data/features/support/testdata/4_input +5 -0
- data/features/support/testdata/4_output +5 -0
- data/features/support/testdata/5_input +13 -0
- data/laser.gemspec +382 -0
- data/lib/laser.rb +98 -0
- data/lib/laser/analysis/annotations.rb +95 -0
- data/lib/laser/analysis/annotations/annotation_config.yaml +3 -0
- data/lib/laser/analysis/annotations/comment_attachment_annotation.rb +66 -0
- data/lib/laser/analysis/annotations/node_pointers_annotation.rb +36 -0
- data/lib/laser/analysis/annotations/runtime_annotation.rb +55 -0
- data/lib/laser/analysis/argument_expansion.rb +132 -0
- data/lib/laser/analysis/arity.rb +34 -0
- data/lib/laser/analysis/bindings.rb +144 -0
- data/lib/laser/analysis/bootstrap/bootstrap.rb +298 -0
- data/lib/laser/analysis/bootstrap/laser_class.rb +106 -0
- data/lib/laser/analysis/bootstrap/laser_method.rb +255 -0
- data/lib/laser/analysis/bootstrap/laser_module.rb +403 -0
- data/lib/laser/analysis/bootstrap/laser_module_copy.rb +74 -0
- data/lib/laser/analysis/bootstrap/laser_object.rb +69 -0
- data/lib/laser/analysis/bootstrap/laser_proc.rb +150 -0
- data/lib/laser/analysis/bootstrap/laser_singleton_class.rb +44 -0
- data/lib/laser/analysis/comments.rb +35 -0
- data/lib/laser/analysis/control_flow.rb +28 -0
- data/lib/laser/analysis/control_flow/alias_analysis.rb +31 -0
- data/lib/laser/analysis/control_flow/basic_block.rb +105 -0
- data/lib/laser/analysis/control_flow/cfg_builder.rb +2505 -0
- data/lib/laser/analysis/control_flow/cfg_instruction.rb +190 -0
- data/lib/laser/analysis/control_flow/constant_propagation.rb +742 -0
- data/lib/laser/analysis/control_flow/control_flow_graph.rb +370 -0
- data/lib/laser/analysis/control_flow/lifetime_analysis.rb +91 -0
- data/lib/laser/analysis/control_flow/method_call_search.rb +26 -0
- data/lib/laser/analysis/control_flow/raise_properties.rb +25 -0
- data/lib/laser/analysis/control_flow/simulation.rb +385 -0
- data/lib/laser/analysis/control_flow/static_single_assignment.rb +185 -0
- data/lib/laser/analysis/control_flow/unreachability_analysis.rb +57 -0
- data/lib/laser/analysis/control_flow/unused_variables.rb +91 -0
- data/lib/laser/analysis/control_flow/yield_properties.rb +103 -0
- data/lib/laser/analysis/errors.rb +131 -0
- data/lib/laser/analysis/laser_utils.rb +18 -0
- data/lib/laser/analysis/lexical_analysis.rb +172 -0
- data/lib/laser/analysis/method_call.rb +68 -0
- data/lib/laser/analysis/protocol_registry.rb +30 -0
- data/lib/laser/analysis/scope.rb +118 -0
- data/lib/laser/analysis/sexp.rb +159 -0
- data/lib/laser/analysis/sexp_analysis.rb +40 -0
- data/lib/laser/analysis/sexp_extensions/constant_extraction.rb +115 -0
- data/lib/laser/analysis/sexp_extensions/source_location.rb +164 -0
- data/lib/laser/analysis/sexp_extensions/type_inference.rb +47 -0
- data/lib/laser/analysis/signature.rb +76 -0
- data/lib/laser/analysis/special_methods/send.rb +67 -0
- data/lib/laser/analysis/unused_methods.rb +21 -0
- data/lib/laser/analysis/visitor.rb +141 -0
- data/lib/laser/annotation_parser/annotations.treetop +126 -0
- data/lib/laser/annotation_parser/annotations_parser.rb +748 -0
- data/lib/laser/annotation_parser/class_annotations.treetop +82 -0
- data/lib/laser/annotation_parser/class_annotations_parser.rb +654 -0
- data/lib/laser/annotation_parser/overload.treetop +24 -0
- data/lib/laser/annotation_parser/overload_parser.rb +167 -0
- data/lib/laser/annotation_parser/parsers.rb +6 -0
- data/lib/laser/annotation_parser/structural.treetop +37 -0
- data/lib/laser/annotation_parser/structural_parser.rb +406 -0
- data/lib/laser/annotation_parser/useful_parsers.treetop +47 -0
- data/lib/laser/annotation_parser/useful_parsers_parser.rb +674 -0
- data/lib/laser/rake/task.rb +46 -0
- data/lib/laser/runner.rb +189 -0
- data/lib/laser/scanner.rb +169 -0
- data/lib/laser/standard_library/_thread.rb +110 -0
- data/lib/laser/standard_library/abbrev.rb +103 -0
- data/lib/laser/standard_library/array.rb +418 -0
- data/lib/laser/standard_library/base64.rb +91 -0
- data/lib/laser/standard_library/basic_object.rb +55 -0
- data/lib/laser/standard_library/benchmark.rb +556 -0
- data/lib/laser/standard_library/bignum.rb +185 -0
- data/lib/laser/standard_library/cgi.rb +275 -0
- data/lib/laser/standard_library/cgi/cookie.rb +147 -0
- data/lib/laser/standard_library/cgi/core.rb +791 -0
- data/lib/laser/standard_library/cgi/html.rb +1021 -0
- data/lib/laser/standard_library/cgi/session.rb +537 -0
- data/lib/laser/standard_library/cgi/session/pstore.rb +111 -0
- data/lib/laser/standard_library/cgi/util.rb +188 -0
- data/lib/laser/standard_library/class_definitions.rb +333 -0
- data/lib/laser/standard_library/comparable.rb +125 -0
- data/lib/laser/standard_library/complex.rb +162 -0
- data/lib/laser/standard_library/enumerable.rb +178 -0
- data/lib/laser/standard_library/exceptions.rb +135 -0
- data/lib/laser/standard_library/fixnum.rb +188 -0
- data/lib/laser/standard_library/float.rb +180 -0
- data/lib/laser/standard_library/hash.rb +237 -0
- data/lib/laser/standard_library/integer.rb +123 -0
- data/lib/laser/standard_library/laser_magic.rb +7 -0
- data/lib/laser/standard_library/nil_false_true.rb +113 -0
- data/lib/laser/standard_library/numbers.rb +192 -0
- data/lib/laser/standard_library/proc.rb +31 -0
- data/lib/laser/standard_library/set.rb +1348 -0
- data/lib/laser/standard_library/string.rb +666 -0
- data/lib/laser/standard_library/stringio.rb +2 -0
- data/lib/laser/standard_library/symbol.rb +125 -0
- data/lib/laser/standard_library/tsort.rb +242 -0
- data/lib/laser/support/acts_as_struct.rb +66 -0
- data/lib/laser/support/frequency.rb +55 -0
- data/lib/laser/support/inheritable_attributes.rb +145 -0
- data/lib/laser/support/module_extensions.rb +94 -0
- data/lib/laser/support/placeholder_object.rb +13 -0
- data/lib/laser/third_party/rgl/adjacency.rb +221 -0
- data/lib/laser/third_party/rgl/base.rb +228 -0
- data/lib/laser/third_party/rgl/bidirectional.rb +39 -0
- data/lib/laser/third_party/rgl/condensation.rb +47 -0
- data/lib/laser/third_party/rgl/connected_components.rb +138 -0
- data/lib/laser/third_party/rgl/control_flow.rb +170 -0
- data/lib/laser/third_party/rgl/depth_first_spanning_tree.rb +37 -0
- data/lib/laser/third_party/rgl/dominators.rb +124 -0
- data/lib/laser/third_party/rgl/dot.rb +93 -0
- data/lib/laser/third_party/rgl/graphxml.rb +51 -0
- data/lib/laser/third_party/rgl/implicit.rb +174 -0
- data/lib/laser/third_party/rgl/mutable.rb +117 -0
- data/lib/laser/third_party/rgl/rdot.rb +445 -0
- data/lib/laser/third_party/rgl/topsort.rb +72 -0
- data/lib/laser/third_party/rgl/transitivity.rb +180 -0
- data/lib/laser/third_party/rgl/traversal.rb +348 -0
- data/lib/laser/types/types.rb +433 -0
- data/lib/laser/version.rb +14 -0
- data/lib/laser/warning.rb +149 -0
- data/lib/laser/warning_sets/default.yml +13 -0
- data/lib/laser/warnings/assignment_in_condition.rb +20 -0
- data/lib/laser/warnings/comment_spacing.rb +31 -0
- data/lib/laser/warnings/extra_blank_lines.rb +30 -0
- data/lib/laser/warnings/extra_whitespace.rb +16 -0
- data/lib/laser/warnings/hash_symbol_18_warning.rb +63 -0
- data/lib/laser/warnings/hash_symbol_19_warning.rb +29 -0
- data/lib/laser/warnings/line_length.rb +115 -0
- data/lib/laser/warnings/misaligned_unindentation.rb +17 -0
- data/lib/laser/warnings/operator_spacing.rb +68 -0
- data/lib/laser/warnings/parens_on_declaration.rb +30 -0
- data/lib/laser/warnings/rescue_exception.rb +42 -0
- data/lib/laser/warnings/semicolon.rb +25 -0
- data/lib/laser/warnings/sexp_errors.rb +24 -0
- data/lib/laser/warnings/uncalled_method_warning.rb +7 -0
- data/lib/laser/warnings/useless_double_quotes.rb +38 -0
- data/spec/analysis_specs/annotations_spec.rb +47 -0
- data/spec/analysis_specs/annotations_specs/comment_attachment_spec.rb +68 -0
- data/spec/analysis_specs/annotations_specs/node_pointers_annotation_spec.rb +90 -0
- data/spec/analysis_specs/annotations_specs/runtime_annotation_spec.rb +135 -0
- data/spec/analysis_specs/annotations_specs/spec_helper.rb +33 -0
- data/spec/analysis_specs/argument_expansion_spec.rb +113 -0
- data/spec/analysis_specs/bindings_spec.rb +36 -0
- data/spec/analysis_specs/comment_spec.rb +93 -0
- data/spec/analysis_specs/control_flow_specs/cfg_instruction_spec.rb +111 -0
- data/spec/analysis_specs/control_flow_specs/constant_propagation_spec.rb +560 -0
- data/spec/analysis_specs/control_flow_specs/control_flow_graph_spec.rb +5 -0
- data/spec/analysis_specs/control_flow_specs/raise_properties_spec.rb +310 -0
- data/spec/analysis_specs/control_flow_specs/raise_type_inference_spec.rb +301 -0
- data/spec/analysis_specs/control_flow_specs/return_type_inference_spec.rb +431 -0
- data/spec/analysis_specs/control_flow_specs/simulation_spec.rb +158 -0
- data/spec/analysis_specs/control_flow_specs/spec_helper.rb +110 -0
- data/spec/analysis_specs/control_flow_specs/tuple_misuse_inference_spec.rb +125 -0
- data/spec/analysis_specs/control_flow_specs/unreachability_analysis_spec.rb +76 -0
- data/spec/analysis_specs/control_flow_specs/unused_variable_spec.rb +99 -0
- data/spec/analysis_specs/control_flow_specs/yield_properties_spec.rb +372 -0
- data/spec/analysis_specs/error_spec.rb +30 -0
- data/spec/analysis_specs/laser_class_spec.rb +322 -0
- data/spec/analysis_specs/lexical_analysis_spec.rb +184 -0
- data/spec/analysis_specs/protocol_registry_spec.rb +63 -0
- data/spec/analysis_specs/scope_annotation_spec.rb +1013 -0
- data/spec/analysis_specs/scope_spec.rb +126 -0
- data/spec/analysis_specs/sexp_analysis_spec.rb +30 -0
- data/spec/analysis_specs/sexp_extension_specs/constant_extraction_spec.rb +309 -0
- data/spec/analysis_specs/sexp_extension_specs/source_location_spec.rb +231 -0
- data/spec/analysis_specs/sexp_extension_specs/spec_helper.rb +1 -0
- data/spec/analysis_specs/sexp_extension_specs/type_inference_spec.rb +252 -0
- data/spec/analysis_specs/sexp_spec.rb +167 -0
- data/spec/analysis_specs/spec_helper.rb +27 -0
- data/spec/analysis_specs/unused_methods_spec.rb +65 -0
- data/spec/analysis_specs/visitor_spec.rb +64 -0
- data/spec/annotation_parser_specs/annotations_parser_spec.rb +89 -0
- data/spec/annotation_parser_specs/class_annotation_parser_spec.rb +120 -0
- data/spec/annotation_parser_specs/overload_parser_spec.rb +39 -0
- data/spec/annotation_parser_specs/parsers_spec.rb +14 -0
- data/spec/annotation_parser_specs/spec_helper.rb +1 -0
- data/spec/annotation_parser_specs/structural_parser_spec.rb +67 -0
- data/spec/laser_spec.rb +14 -0
- data/spec/rake_specs/spec_helper.rb +1 -0
- data/spec/rake_specs/task_spec.rb +67 -0
- data/spec/runner_spec.rb +207 -0
- data/spec/scanner_spec.rb +75 -0
- data/spec/spec_helper.rb +121 -0
- data/spec/standard_library/exceptions_spec.rb +19 -0
- data/spec/standard_library/globals_spec.rb +14 -0
- data/spec/standard_library/set_spec.rb +31 -0
- data/spec/standard_library/spec_helper.rb +1 -0
- data/spec/standard_library/standard_library_spec.rb +302 -0
- data/spec/support_specs/acts_as_struct_spec.rb +94 -0
- data/spec/support_specs/frequency_spec.rb +23 -0
- data/spec/support_specs/module_extensions_spec.rb +117 -0
- data/spec/support_specs/spec_helper.rb +1 -0
- data/spec/type_specs/spec_helper.rb +1 -0
- data/spec/type_specs/types_spec.rb +133 -0
- data/spec/warning_spec.rb +95 -0
- data/spec/warning_specs/assignment_in_condition_spec.rb +68 -0
- data/spec/warning_specs/comment_spacing_spec.rb +65 -0
- data/spec/warning_specs/extra_blank_lines_spec.rb +70 -0
- data/spec/warning_specs/extra_whitespace_spec.rb +33 -0
- data/spec/warning_specs/hash_symbol_18_warning_spec.rb +89 -0
- data/spec/warning_specs/hash_symbol_19_warning_spec.rb +63 -0
- data/spec/warning_specs/line_length_spec.rb +173 -0
- data/spec/warning_specs/misaligned_unindentation_spec.rb +35 -0
- data/spec/warning_specs/operator_spacing_spec.rb +104 -0
- data/spec/warning_specs/parens_on_declaration_spec.rb +57 -0
- data/spec/warning_specs/rescue_exception_spec.rb +105 -0
- data/spec/warning_specs/semicolon_spec.rb +58 -0
- data/spec/warning_specs/spec_helper.rb +1 -0
- data/spec/warning_specs/useless_double_quotes_spec.rb +74 -0
- data/status_reports/2010/12/2010-12-14.md +163 -0
- data/status_reports/2010/12/2010-12-23.md +298 -0
- data/status_reports/2010/12/2010-12-24.md +6 -0
- data/test/third_party_tests/rgl_tests/TestComponents.rb +65 -0
- data/test/third_party_tests/rgl_tests/TestCycles.rb +61 -0
- data/test/third_party_tests/rgl_tests/TestDirectedGraph.rb +125 -0
- data/test/third_party_tests/rgl_tests/TestDot.rb +18 -0
- data/test/third_party_tests/rgl_tests/TestEdge.rb +34 -0
- data/test/third_party_tests/rgl_tests/TestGraph.rb +71 -0
- data/test/third_party_tests/rgl_tests/TestGraphXML.rb +57 -0
- data/test/third_party_tests/rgl_tests/TestImplicit.rb +52 -0
- data/test/third_party_tests/rgl_tests/TestRdot.rb +863 -0
- data/test/third_party_tests/rgl_tests/TestTransitivity.rb +129 -0
- data/test/third_party_tests/rgl_tests/TestTraversal.rb +220 -0
- data/test/third_party_tests/rgl_tests/TestUnDirectedGraph.rb +102 -0
- data/test/third_party_tests/rgl_tests/examples/north/Graph.log +128 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.0.graphml +28 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.1.graphml +28 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.11.graphml +31 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.12.graphml +27 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.13.graphml +27 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.14.graphml +27 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.15.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.16.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.17.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.19.graphml +37 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.2.graphml +28 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.20.graphml +38 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.22.graphml +43 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.24.graphml +30 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.25.graphml +45 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.27.graphml +38 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.28.graphml +30 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.29.graphml +38 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.3.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.30.graphml +34 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.31.graphml +42 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.34.graphml +42 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.37.graphml +28 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.38.graphml +38 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.39.graphml +36 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.4.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.40.graphml +37 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.41.graphml +37 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.42.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.45.graphml +28 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.46.graphml +32 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.5.graphml +31 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.50.graphml +30 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.56.graphml +29 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.57.graphml +32 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.58.graphml +32 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.6.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.60.graphml +32 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.61.graphml +34 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.62.graphml +34 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.68.graphml +30 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.69.graphml +32 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.7.graphml +29 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.70.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.71.graphml +27 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.72.graphml +28 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.74.graphml +29 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.75.graphml +29 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.78.graphml +27 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.79.graphml +34 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.8.graphml +29 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.80.graphml +34 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.82.graphml +35 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.83.graphml +32 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.85.graphml +34 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.86.graphml +34 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.88.graphml +37 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.89.graphml +29 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.9.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.90.graphml +32 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.91.graphml +31 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.92.graphml +26 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.93.graphml +32 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.10.94.graphml +34 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.12.8.graphml +40 -0
- data/test/third_party_tests/rgl_tests/examples/north/g.14.9.graphml +36 -0
- data/test/third_party_tests/rgl_tests/test_helper.rb +7 -0
- data/test/third_party_tests/test_inheritable_attributes.rb +187 -0
- metadata +470 -0
@@ -0,0 +1,94 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe ActsAsStruct do
|
4
|
+
members = :first, :second, :third, :fourth, :fifth
|
5
|
+
values = 1, 2, 3, 4, 5
|
6
|
+
zipped = members.zip(values)
|
7
|
+
derived_members = members + [:sixth, :seventh]
|
8
|
+
derived_values = values + [6, 7]
|
9
|
+
derived_zipped = derived_members.zip(derived_values)
|
10
|
+
|
11
|
+
before do
|
12
|
+
@class = Class.new do
|
13
|
+
extend ActsAsStruct
|
14
|
+
acts_as_struct *members
|
15
|
+
end
|
16
|
+
@instance = @class.new(*values)
|
17
|
+
@derived_class = Class.new(@class) do
|
18
|
+
acts_as_struct(*(derived_members - members))
|
19
|
+
end
|
20
|
+
@derived_instance = @derived_class.new(*derived_values)
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#acts_as_struct' do
|
24
|
+
it 'creates readers for all named attributes' do
|
25
|
+
members.each { |member| @instance.should respond_to(member) }
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'creates writers for all named attributes' do
|
29
|
+
members.each { |member| @instance.should respond_to("#{member}=") }
|
30
|
+
end
|
31
|
+
|
32
|
+
describe '#initialize' do
|
33
|
+
it 'allows initialization via positional arguments' do
|
34
|
+
zipped.each { |member, value| @instance.send(member).should == value }
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'allows initialization with a hash' do
|
38
|
+
instance = @class.new(Hash[zipped.flatten])
|
39
|
+
zipped.each { |member, value| @instance.send(member).should == value }
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'allows fewer positional arguments than the maximum' do
|
43
|
+
instance = @class.new(1)
|
44
|
+
instance.first.should == 1
|
45
|
+
instance.third.should == nil
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'raises on too many positional arguments' do
|
49
|
+
expect { @class.new(1,2,3,4,5,6) }.to raise_error(ArgumentError)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#keys' do
|
54
|
+
it 'returns the keys used in acts_as_struct' do
|
55
|
+
@instance.keys.should == members
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe '#values' do
|
60
|
+
it 'returns the values in the same order as used in acts_as_struct' do
|
61
|
+
@instance.values.should == values
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe '#keys_and_values' do
|
66
|
+
it 'returns the keys and values arrays zipped' do
|
67
|
+
@instance.keys_and_values.should == zipped
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe '#each' do
|
72
|
+
it 'yields each key and value in order' do
|
73
|
+
yielded_values = []
|
74
|
+
@instance.each { |k, v| yielded_values << [k, v] }
|
75
|
+
yielded_values.should == zipped
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe '#<=>' do
|
80
|
+
it 'compares the values pairwise, in the order given by the acts_as_struct call' do
|
81
|
+
@class.new(1,2,3).should be < @class.new(2,2,3)
|
82
|
+
@class.new(1,2,3).should be < @class.new(1,2,4)
|
83
|
+
@class.new(1,2,3).should be == @class.new(1,2,3)
|
84
|
+
@class.new(4,4,5).should be > @class.new(4,4,4)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'when used in a derived class that is also using acts_as_struct' do
|
89
|
+
it 'should simply append the new members to create a compatible subtype' do
|
90
|
+
@derived_instance.keys_and_values.should == derived_zipped
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe Frequency do
|
4
|
+
describe Frequency::NEVER do
|
5
|
+
it { Frequency::NEVER.should be == Frequency::NEVER }
|
6
|
+
it { Frequency::NEVER.should be < Frequency::MAYBE }
|
7
|
+
it { Frequency::NEVER.should be < Frequency::ALWAYS }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Frequency::MAYBE do
|
11
|
+
it { Frequency::MAYBE.should be > Frequency::NEVER }
|
12
|
+
it { Frequency::MAYBE.should be == Frequency::MAYBE }
|
13
|
+
it { Frequency::MAYBE.should be < Frequency::ALWAYS }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe Frequency::ALWAYS do
|
17
|
+
it { Frequency::ALWAYS.should be > Frequency::NEVER }
|
18
|
+
it { Frequency::ALWAYS.should be > Frequency::MAYBE }
|
19
|
+
it { Frequency::ALWAYS.should be == Frequency::ALWAYS }
|
20
|
+
end
|
21
|
+
|
22
|
+
it { Frequency.should_not respond_to(:new) }
|
23
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe ModuleExtensions do
|
4
|
+
before do
|
5
|
+
@class = Class.new do
|
6
|
+
extend ModuleExtensions
|
7
|
+
attr_accessor_with_default :acc, {a: 2}
|
8
|
+
cattr_reader :read1, :read2
|
9
|
+
cattr_writer :write1, :write2
|
10
|
+
cattr_accessor :both1, :both2
|
11
|
+
cattr_accessor_with_default :arr1, []
|
12
|
+
def even?(x)
|
13
|
+
x % 2 == 0
|
14
|
+
end
|
15
|
+
opposite_method :odd?, :even?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'attr_accessor_with_default' do
|
20
|
+
it 'creates an reader that defaults to the provided value' do
|
21
|
+
@class.new.acc.should == {a: 2}
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'creates a writer that causes the default to be lost forever' do
|
25
|
+
x = @class.new
|
26
|
+
x.acc = {b: 3}
|
27
|
+
x.acc.should == {b: 3}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#cattr_reader' do
|
32
|
+
it 'creates reading methods for the given variables' do
|
33
|
+
@class.__send__(:instance_variable_set, :@read1, 'hello')
|
34
|
+
@class.read1.should == 'hello'
|
35
|
+
@class.__send__(:instance_variable_set, :@read2, 5)
|
36
|
+
@class.read2.should == 5
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#cattr_writer' do
|
41
|
+
it 'creates writing methods for the given variables' do
|
42
|
+
@class.write1 = 'hello'
|
43
|
+
@class.__send__(:instance_variable_get, :@write1).should == 'hello'
|
44
|
+
@class.write2 = 5
|
45
|
+
@class.__send__(:instance_variable_get, :@write2).should == 5
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#cattr_accessor' do
|
50
|
+
it 'creates reading and writing methods for the given variables' do
|
51
|
+
@class.both1 = 'hello'
|
52
|
+
@class.both1.should == 'hello'
|
53
|
+
@class.__send__(:instance_variable_get, :@both1).should == 'hello'
|
54
|
+
@class.__send__(:instance_variable_set, :@both1, 'world')
|
55
|
+
@class.both1.should == 'world'
|
56
|
+
@class.both2 = 5
|
57
|
+
@class.both2.should == 5
|
58
|
+
@class.__send__(:instance_variable_get, :@both2).should == 5
|
59
|
+
@class.__send__(:instance_variable_set, :@both2, 10)
|
60
|
+
@class.both2.should == 10
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#cattr_accessor_with_default' do
|
65
|
+
it 'creates reading and writing methods, but defaults the ivar value' do
|
66
|
+
@class.arr1.should == []
|
67
|
+
@class.__send__(:instance_variable_get, :@arr1).should == []
|
68
|
+
@class.arr1.should == [] # second invocation, after default value set
|
69
|
+
@class.arr1 = [1, 2]
|
70
|
+
@class.arr1.should == [1, 2]
|
71
|
+
@class.__send__(:instance_variable_get, :@arr1).should == [1, 2]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '#cattr_get_and_setter' do
|
76
|
+
before do
|
77
|
+
@base = Class.new do
|
78
|
+
extend ModuleExtensions
|
79
|
+
cattr_get_and_setter :type
|
80
|
+
type :silly
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'acts a setter and getter on the base class' do
|
85
|
+
@base.type.should == :silly
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'is not inherited' do
|
89
|
+
@derived = Class.new(@base)
|
90
|
+
@derived.type.should_not == :silly
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'can be used by inherited classes' do
|
94
|
+
@derived = Class.new(@base) do
|
95
|
+
type :laughable
|
96
|
+
end
|
97
|
+
@derived.type.should == :laughable
|
98
|
+
@base.type.should == :silly
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'turns a block into a proc and sets it' do
|
102
|
+
@derived = Class.new(@base) do
|
103
|
+
type { 5 + 3 }
|
104
|
+
end
|
105
|
+
@derived.type.call.should == 8
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '#opposite_method' do
|
110
|
+
it 'creates a new method that is the opposite of the specified method' do
|
111
|
+
@class.new.even?(4).should be true
|
112
|
+
@class.new.odd?(4).should be false
|
113
|
+
@class.new.even?(1).should be false
|
114
|
+
@class.new.odd?(1).should be true
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative '../spec_helper'
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative '../spec_helper'
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe Types do
|
4
|
+
describe '.subtype?' do
|
5
|
+
describe 'invariant class types' do
|
6
|
+
it 'should include itself' do
|
7
|
+
Types.subtype?(Types::ClassType.new('Integer', :invariant),
|
8
|
+
Types::ClassType.new('Integer', :invariant)).should be true
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should not include subclasses' do
|
12
|
+
Types.subtype?(Types::ClassType.new('Fixnum', :invariant),
|
13
|
+
Types::ClassType.new('Integer', :invariant)).should be false
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should not include superclasses' do
|
17
|
+
Types.subtype?(Types::ClassType.new('Numeric', :invariant),
|
18
|
+
Types::ClassType.new('Integer', :invariant)).should be false
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'covariant class types' do
|
23
|
+
it 'should include itself' do
|
24
|
+
Types.subtype?(Types::ClassType.new('Integer', :invariant),
|
25
|
+
Types::ClassType.new('Integer', :covariant)).should be true
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should include subclasses' do
|
29
|
+
Types.subtype?(Types::ClassType.new('Fixnum', :invariant),
|
30
|
+
Types::ClassType.new('Integer', :covariant)).should be true
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should not include superclasses' do
|
34
|
+
Types.subtype?(Types::ClassType.new('Numeric', :invariant),
|
35
|
+
Types::ClassType.new('Integer', :covariant)).should be false
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should include a union of subclasses' do
|
39
|
+
Types.subtype?(Types::UnionType.new(
|
40
|
+
[Types::ClassType.new('Integer', :invariant),
|
41
|
+
Types::ClassType.new('Float', :invariant)]),
|
42
|
+
Types::ClassType.new('Numeric', :covariant)).should be true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'contravariant class types' do
|
47
|
+
it 'should include itself' do
|
48
|
+
Types.subtype?(Types::ClassType.new('Integer', :invariant),
|
49
|
+
Types::ClassType.new('Integer', :contravariant)).should be true
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should not include subclasses' do
|
53
|
+
Types.subtype?(Types::ClassType.new('Fixnum', :invariant),
|
54
|
+
Types::ClassType.new('Integer', :contravariant)).should be false
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should include superclasses' do
|
58
|
+
Types.subtype?(Types::ClassType.new('Numeric', :invariant),
|
59
|
+
Types::ClassType.new('Integer', :contravariant)).should be true
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe 'union types' do
|
64
|
+
it 'should include member types' do
|
65
|
+
Types.subtype?(Types::ClassType.new('Integer', :invariant),
|
66
|
+
Types::UnionType.new(
|
67
|
+
[Types::ClassType.new('Integer', :invariant),
|
68
|
+
Types::ClassType.new('String', :invariant)])).should be true
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
describe Types::TOP do
|
73
|
+
it 'should be equal to a covariant BasicObject instance' do
|
74
|
+
Types::TOP.should == Types::ClassType.new('BasicObject', :covariant)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
describe Types::UnionType do
|
79
|
+
it 'should compare equal despite member type ordering' do
|
80
|
+
Types::UnionType.new([Types::STRING, Types::FIXNUM, Types::ARRAY]).should ==
|
81
|
+
Types::UnionType.new([Types::ARRAY, Types::STRING, Types::FIXNUM])
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe Types::ClassType do
|
86
|
+
describe '#possible_classes' do
|
87
|
+
it 'should find subclasses if the ClassType is covariant and is a Class' do
|
88
|
+
Types::ClassType.new('Integer', :covariant).possible_classes.should be_superset(
|
89
|
+
::Set[ClassRegistry['Integer'], ClassRegistry['Fixnum'], ClassRegistry['Bignum']])
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should find the exact class ClassType is invariant and is a Class' do
|
93
|
+
Types::ClassType.new('Integer', :invariant).possible_classes.should ==
|
94
|
+
::Set[ClassRegistry['Integer']]
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should find superclasses if the ClassType is invariant and is a Class' do
|
98
|
+
Types::ClassType.new('Fixnum', :contravariant).possible_classes.should ==
|
99
|
+
::Set[ClassRegistry['Fixnum'], ClassRegistry['Integer'], ClassRegistry['Numeric'],
|
100
|
+
ClassRegistry['Object'], ClassRegistry['BasicObject']]
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'should find classes including the module if the ClassType is covariant and is a Module' do
|
104
|
+
Types::ClassType.new('Kernel', :covariant).possible_classes.should ==
|
105
|
+
::Set.new(ClassRegistry['Object'].subset)
|
106
|
+
comparables = Types::ClassType.new('Comparable', :covariant).possible_classes
|
107
|
+
%w(String Numeric Integer Fixnum Bignum Float).each do |comparable|
|
108
|
+
comparables.should include(ClassRegistry[comparable])
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
describe '#matching_methods' do
|
114
|
+
it 'should search the possible classes for instance methods of the same name (covariant)' do
|
115
|
+
Types::ClassType.new('Integer', :covariant).matching_methods('modulo').should ==
|
116
|
+
[ClassRegistry['Numeric'].instance_method(:modulo),
|
117
|
+
ClassRegistry['Fixnum'].instance_method(:modulo),
|
118
|
+
ClassRegistry['Bignum'].instance_method(:modulo)]
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should search the possible classes for instance methods of the same name (invariant)' do
|
122
|
+
Types::ClassType.new('Integer', :invariant).matching_methods('odd?').should ==
|
123
|
+
[ClassRegistry['Integer'].instance_method(:odd?)]
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'should search the possible classes for instance methods of the same name (contravariant)' do
|
127
|
+
Types::ClassType.new('Bignum', :contravariant).matching_methods('odd?').should ==
|
128
|
+
[ClassRegistry['Bignum'].instance_method(:odd?),
|
129
|
+
ClassRegistry['Integer'].instance_method(:odd?)]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe Warning do
|
4
|
+
describe 'when subclassed' do
|
5
|
+
it 'registers the new class in all_warnings' do
|
6
|
+
klass = Class.new(Warning)
|
7
|
+
Warning.all_warnings.should include(klass)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'does not match anything' do
|
12
|
+
Warning.should_not warn('hello(world)')
|
13
|
+
Warning.should_not warn(' a +b ')
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'short names in warnings' do
|
17
|
+
before do
|
18
|
+
@real_warnings = Warning.all_warnings.select do |x|
|
19
|
+
x.name && x != Warning && x != FileWarning && x != LineWarning
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'exist for every warning class' do
|
24
|
+
@real_warnings.select {|x| x.name && x.short_name == nil}.should be_empty
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'do not conflict with each other' do
|
28
|
+
short_names = @real_warnings.map {|x| x.short_name}.uniq
|
29
|
+
short_names.size.should == @real_warnings.size
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'does not change lines when it fixes them' do
|
34
|
+
Warning.should correct_to('a+b', 'a+b')
|
35
|
+
Warning.should correct_to(' b ** c+1 eval(string) ', ' b ** c+1 eval(string) ')
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#concrete_warnings' do
|
39
|
+
before { @concrete = Warning.concrete_warnings }
|
40
|
+
it 'returns a list of classes that are subclasses of Warning' do
|
41
|
+
@concrete.should_not be_empty
|
42
|
+
@concrete.each {|w| w.ancestors.should include(Warning) }
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns a list that does not contain Warning, FileWarning, or LineWarning' do
|
46
|
+
@concrete.should_not include(Warning)
|
47
|
+
@concrete.should_not include(FileWarning)
|
48
|
+
@concrete.should_not include(LineWarning)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe '#desc' do
|
53
|
+
it "defaults to the class's name with all info" do
|
54
|
+
warning = Warning.new('hello.rb', 'a+b')
|
55
|
+
warning.severity = 7
|
56
|
+
warning.line_number = 3
|
57
|
+
warning.desc.should == 'Laser::Warning hello.rb:3 (7)'
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'when specified in a subclass as a string, just uses the string' do
|
61
|
+
subclass = Class.new(Warning) { desc 'hello' }
|
62
|
+
subclass.new('a', 'b').desc.should == 'hello'
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'when specified in a subclass as a block, runs that proc as the instance' do
|
66
|
+
subclass = Class.new(Warning) do
|
67
|
+
severity 1024
|
68
|
+
desc { self.class.severity.to_s }
|
69
|
+
end
|
70
|
+
subclass.new('a', 'b').desc.should == '1024'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe '#type' do
|
75
|
+
it 'returns the current type when no args are provided' do
|
76
|
+
klass = Class.new(Warning) do
|
77
|
+
def self.set_type
|
78
|
+
@type = 'hai'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
klass.set_type
|
82
|
+
klass.type.should == 'hai'
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'sets the type when an argument is provided' do
|
86
|
+
klass = Class.new(Warning) { type :silly }
|
87
|
+
klass.type.should == 'silly'
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'sets a short name based on the type provided' do
|
91
|
+
klass = Class.new(Warning) { type :silly }
|
92
|
+
klass.short_name.should =~ /SI\d/
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|