puppet 4.2.3-x86-mingw32 → 4.3.0-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- data/Gemfile +3 -0
- data/README.md +1 -1
- data/ext/debian/puppet.init +0 -1
- data/ext/debian/puppet.logrotate +14 -5
- data/ext/osx/puppet.plist +0 -2
- data/ext/redhat/client.init +13 -5
- data/ext/redhat/logrotate +15 -3
- data/ext/redhat/puppet.spec.erb +5 -1
- data/ext/redhat/server.init +1 -1
- data/ext/systemd/puppet.service +1 -0
- data/lib/puppet.rb +12 -0
- data/lib/puppet/agent.rb +4 -4
- data/lib/puppet/agent/locker.rb +11 -2
- data/lib/puppet/application/agent.rb +5 -1
- data/lib/puppet/application/apply.rb +4 -0
- data/lib/puppet/application/filebucket.rb +78 -4
- data/lib/puppet/application/lookup.rb +356 -0
- data/lib/puppet/application/master.rb +3 -0
- data/lib/puppet/configurer.rb +9 -5
- data/lib/puppet/context.rb +16 -1
- data/lib/puppet/context/trusted_information.rb +21 -1
- data/lib/puppet/daemon.rb +17 -13
- data/lib/puppet/data_binding.rb +4 -2
- data/lib/puppet/data_providers.rb +12 -13
- data/lib/puppet/data_providers/data_adapter.rb +7 -68
- data/lib/puppet/data_providers/data_function_support.rb +5 -26
- data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
- data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
- data/lib/puppet/data_providers/hiera_config.rb +106 -0
- data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
- data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
- data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
- data/lib/puppet/data_providers/hiera_support.rb +37 -0
- data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
- data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
- data/lib/puppet/defaults.rb +12 -2
- data/lib/puppet/error.rb +4 -0
- data/lib/puppet/face/module/changes.rb +2 -1
- data/lib/puppet/feature/cfacter.rb +1 -0
- data/lib/puppet/file_bucket/dipper.rb +58 -2
- data/lib/puppet/functions.rb +2 -4
- data/lib/puppet/functions/assert_type.rb +48 -12
- data/lib/puppet/functions/defined.rb +79 -48
- data/lib/puppet/functions/each.rb +85 -27
- data/lib/puppet/functions/filter.rb +58 -23
- data/lib/puppet/functions/hiera.rb +76 -3
- data/lib/puppet/functions/hiera_array.rb +65 -3
- data/lib/puppet/functions/hiera_hash.rb +74 -2
- data/lib/puppet/functions/hiera_include.rb +75 -2
- data/lib/puppet/functions/lookup.rb +19 -17
- data/lib/puppet/functions/map.rb +56 -21
- data/lib/puppet/functions/match.rb +29 -12
- data/lib/puppet/functions/reduce.rb +95 -58
- data/lib/puppet/functions/versioncmp.rb +36 -0
- data/lib/puppet/functions/with.rb +15 -7
- data/lib/puppet/indirector/catalog/compiler.rb +3 -3
- data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
- data/lib/puppet/indirector/data_binding/none.rb +4 -1
- data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
- data/lib/puppet/indirector/hiera.rb +4 -0
- data/lib/puppet/indirector/json.rb +1 -1
- data/lib/puppet/indirector/msgpack.rb +1 -1
- data/lib/puppet/indirector/request.rb +7 -8
- data/lib/puppet/indirector/resource_type/parser.rb +5 -3
- data/lib/puppet/info_service.rb +7 -0
- data/lib/puppet/info_service/class_information_service.rb +111 -0
- data/lib/puppet/module_tool/metadata.rb +32 -9
- data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
- data/lib/puppet/network/authconfig.rb +21 -1
- data/lib/puppet/network/authorization.rb +8 -1
- data/lib/puppet/network/http/api/master/v3.rb +7 -1
- data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
- data/lib/puppet/node/environment.rb +9 -2
- data/lib/puppet/parser.rb +3 -0
- data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
- data/lib/puppet/parser/compiler.rb +302 -12
- data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
- data/lib/puppet/parser/environment_compiler.rb +165 -0
- data/lib/puppet/parser/functions/assert_type.rb +46 -16
- data/lib/puppet/parser/functions/defined.rb +105 -68
- data/lib/puppet/parser/functions/each.rb +85 -27
- data/lib/puppet/parser/functions/filter.rb +59 -23
- data/lib/puppet/parser/functions/hiera.rb +83 -27
- data/lib/puppet/parser/functions/hiera_array.rb +71 -28
- data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
- data/lib/puppet/parser/functions/hiera_include.rb +81 -40
- data/lib/puppet/parser/functions/map.rb +55 -20
- data/lib/puppet/parser/functions/match.rb +27 -12
- data/lib/puppet/parser/functions/reduce.rb +97 -60
- data/lib/puppet/parser/functions/with.rb +16 -8
- data/lib/puppet/parser/resource.rb +98 -19
- data/lib/puppet/plugins/configuration.rb +3 -2
- data/lib/puppet/plugins/data_providers.rb +12 -60
- data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
- data/lib/puppet/plugins/data_providers/registry.rb +84 -0
- data/lib/puppet/pops.rb +19 -17
- data/lib/puppet/pops/adapters.rb +12 -0
- data/lib/puppet/pops/binder/binder.rb +2 -2
- data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
- data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
- data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
- data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
- data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
- data/lib/puppet/pops/binder/injector.rb +4 -4
- data/lib/puppet/pops/binder/key_factory.rb +3 -9
- data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
- data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
- data/lib/puppet/pops/evaluator/closure.rb +8 -8
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
- data/lib/puppet/pops/functions/dispatcher.rb +3 -3
- data/lib/puppet/pops/issues.rb +1 -1
- data/lib/puppet/pops/label_provider.rb +1 -1
- data/lib/puppet/pops/lookup.rb +25 -47
- data/lib/puppet/pops/lookup/explainer.rb +402 -0
- data/lib/puppet/pops/lookup/invocation.rb +117 -0
- data/lib/puppet/pops/merge_strategy.rb +73 -5
- data/lib/puppet/pops/model/factory.rb +34 -0
- data/lib/puppet/pops/model/model_label_provider.rb +10 -1
- data/lib/puppet/pops/model/model_meta.rb +15 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
- data/lib/puppet/pops/parser/code_merger.rb +13 -1
- data/lib/puppet/pops/parser/egrammar.ra +56 -3
- data/lib/puppet/pops/parser/eparser.rb +1549 -1352
- data/lib/puppet/pops/parser/lexer2.rb +31 -6
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/parser_support.rb +25 -13
- data/lib/puppet/pops/types/enumeration.rb +1 -2
- data/lib/puppet/pops/types/type_asserter.rb +16 -15
- data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
- data/lib/puppet/pops/types/type_calculator.rb +171 -1020
- data/lib/puppet/pops/types/type_factory.rb +87 -148
- data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
- data/lib/puppet/pops/types/type_parser.rb +116 -127
- data/lib/puppet/pops/types/types.rb +1394 -255
- data/lib/puppet/pops/types/types_meta.rb +0 -234
- data/lib/puppet/pops/validation.rb +7 -2
- data/lib/puppet/pops/validation/checker4_0.rb +28 -0
- data/lib/puppet/provider/augeas/augeas.rb +50 -0
- data/lib/puppet/provider/group/directoryservice.rb +10 -0
- data/lib/puppet/provider/package/dnf.rb +41 -0
- data/lib/puppet/provider/package/gem.rb +7 -2
- data/lib/puppet/provider/package/rpm.rb +1 -0
- data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
- data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
- data/lib/puppet/provider/package/windows/package.rb +9 -1
- data/lib/puppet/provider/package/yum.rb +14 -9
- data/lib/puppet/provider/service/bsd.rb +1 -1
- data/lib/puppet/provider/service/debian.rb +21 -0
- data/lib/puppet/provider/service/init.rb +6 -0
- data/lib/puppet/provider/service/rcng.rb +51 -0
- data/lib/puppet/provider/service/redhat.rb +2 -1
- data/lib/puppet/provider/service/smf.rb +43 -2
- data/lib/puppet/provider/service/src.rb +27 -0
- data/lib/puppet/provider/service/systemd.rb +15 -3
- data/lib/puppet/provider/sshkey/parsed.rb +19 -9
- data/lib/puppet/reference/report.rb +9 -12
- data/lib/puppet/reports.rb +5 -1
- data/lib/puppet/resource.rb +50 -73
- data/lib/puppet/resource/capability_finder.rb +95 -0
- data/lib/puppet/resource/catalog.rb +47 -7
- data/lib/puppet/resource/status.rb +0 -2
- data/lib/puppet/resource/type.rb +238 -44
- data/lib/puppet/resource/type_collection.rb +60 -2
- data/lib/puppet/settings.rb +2 -2
- data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
- data/lib/puppet/ssl/oids.rb +9 -1
- data/lib/puppet/transaction.rb +4 -1
- data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
- data/lib/puppet/transaction/resource_harness.rb +9 -4
- data/lib/puppet/type.rb +74 -3
- data/lib/puppet/type/augeas.rb +8 -0
- data/lib/puppet/type/file/source.rb +14 -12
- data/lib/puppet/type/user.rb +4 -2
- data/lib/puppet/util/windows/security.rb +4 -1
- data/lib/puppet/util/windows/taskscheduler.rb +1 -1
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
- data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
- data/spec/integration/data_binding_spec.rb +229 -0
- data/spec/integration/file_bucket/file_spec.rb +2 -2
- data/spec/integration/parser/compiler_spec.rb +23 -19
- data/spec/integration/parser/resource_expressions_spec.rb +4 -4
- data/spec/integration/parser/undef_param_spec.rb +1 -1
- data/spec/integration/resource/catalog_spec.rb +1 -1
- data/spec/integration/type/package_spec.rb +2 -0
- data/spec/integration/util/windows/security_spec.rb +18 -0
- data/spec/lib/matchers/include_in_order.rb +2 -2
- data/spec/shared_behaviours/iterative_functions.rb +8 -8
- data/spec/spec_helper.rb +7 -0
- data/spec/unit/agent/locker_spec.rb +4 -4
- data/spec/unit/agent_spec.rb +0 -8
- data/spec/unit/application/agent_spec.rb +5 -0
- data/spec/unit/application/apply_spec.rb +8 -0
- data/spec/unit/application/filebucket_spec.rb +87 -1
- data/spec/unit/application/lookup_spec.rb +195 -0
- data/spec/unit/appmgmt_spec.rb +657 -0
- data/spec/unit/capability_spec.rb +414 -0
- data/spec/unit/configurer_spec.rb +7 -1
- data/spec/unit/context/trusted_information_spec.rb +24 -1
- data/spec/unit/daemon_spec.rb +18 -8
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
- data/spec/unit/file_bucket/dipper_spec.rb +210 -1
- data/spec/unit/functions/assert_type_spec.rb +5 -7
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/epp_spec.rb +2 -2
- data/spec/unit/functions/lookup_spec.rb +200 -9
- data/spec/unit/functions/regsubst_spec.rb +17 -8
- data/spec/unit/functions/scanf_spec.rb +1 -1
- data/spec/unit/functions/split_spec.rb +2 -2
- data/spec/unit/functions/versioncmp_spec.rb +36 -0
- data/spec/unit/functions4_spec.rb +58 -72
- data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
- data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
- data/spec/unit/indirector/request_spec.rb +8 -8
- data/spec/unit/info_service_spec.rb +236 -0
- data/spec/unit/module_tool/metadata_spec.rb +31 -2
- data/spec/unit/network/authconfig_spec.rb +62 -32
- data/spec/unit/network/authorization_spec.rb +30 -2
- data/spec/unit/network/http/connection_spec.rb +14 -19
- data/spec/unit/parser/compiler_spec.rb +86 -2
- data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
- data/spec/unit/parser/resource_spec.rb +2 -20
- data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
- data/spec/unit/pops/binder/injector_spec.rb +3 -3
- data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
- data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +19 -11
- data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
- data/spec/unit/pops/label_provider_spec.rb +5 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +33 -7
- data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
- data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
- data/spec/unit/pops/parser/parser_spec.rb +18 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
- data/spec/unit/pops/types/type_factory_spec.rb +12 -12
- data/spec/unit/pops/types/type_parser_spec.rb +7 -12
- data/spec/unit/pops/validator/validator_spec.rb +25 -0
- data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
- data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
- data/spec/unit/provider/package/dnf_spec.rb +92 -0
- data/spec/unit/provider/package/gem_spec.rb +7 -0
- data/spec/unit/provider/package/rpm_spec.rb +25 -2
- data/spec/unit/provider/package/windows/package_spec.rb +41 -0
- data/spec/unit/provider/package/yum_spec.rb +21 -13
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
- data/spec/unit/provider/service/debian_spec.rb +27 -0
- data/spec/unit/provider/service/rcng_spec.rb +41 -0
- data/spec/unit/provider/service/redhat_spec.rb +8 -1
- data/spec/unit/provider/service/smf_spec.rb +30 -5
- data/spec/unit/provider/service/src_spec.rb +19 -4
- data/spec/unit/provider/service/systemd_spec.rb +78 -29
- data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
- data/spec/unit/reports_spec.rb +10 -0
- data/spec/unit/resource/capability_finder_spec.rb +56 -0
- data/spec/unit/resource/catalog_spec.rb +31 -8
- data/spec/unit/resource/type_collection_spec.rb +23 -2
- data/spec/unit/resource/type_spec.rb +1 -1
- data/spec/unit/resource_spec.rb +22 -4
- data/spec/unit/settings_spec.rb +90 -1
- data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
- data/spec/unit/ssl/oids_spec.rb +8 -0
- data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
- data/spec/unit/transaction/report_spec.rb +24 -1
- data/spec/unit/type/package_spec.rb +1 -0
- data/spec/unit/type/user_spec.rb +14 -7
- data/spec/unit/type_spec.rb +1 -1
- metadata +169 -5
- data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
- data/spec/integration/data_binding.rb +0 -104
@@ -2,7 +2,11 @@ require 'spec_helper'
|
|
2
2
|
require 'puppet/pops'
|
3
3
|
|
4
4
|
describe Puppet::Pops::LabelProvider do
|
5
|
-
|
5
|
+
class TestLabelProvider
|
6
|
+
include Puppet::Pops::LabelProvider
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:labeler) { TestLabelProvider.new }
|
6
10
|
|
7
11
|
it "prefixes words that start with a vowel with an 'an'" do
|
8
12
|
expect(labeler.a_an('owl')).to eq('an owl')
|
@@ -2,6 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'matchers/match_tokens2'
|
3
3
|
require 'puppet/pops'
|
4
4
|
require 'puppet/pops/parser/lexer2'
|
5
|
+
require_relative './parser_rspec_helper'
|
5
6
|
|
6
7
|
module EgrammarLexer2Spec
|
7
8
|
def tokens_scanned_from(s)
|
@@ -19,6 +20,7 @@ end
|
|
19
20
|
|
20
21
|
describe 'Lexer2' do
|
21
22
|
include EgrammarLexer2Spec
|
23
|
+
include ParserRspecHelper
|
22
24
|
|
23
25
|
{
|
24
26
|
:LISTSTART => '[',
|
@@ -100,13 +102,37 @@ describe 'Lexer2' do
|
|
100
102
|
end
|
101
103
|
end
|
102
104
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
105
|
+
context 'when app_management is off (by default)' do
|
106
|
+
{
|
107
|
+
"application" => :APPLICATION_R,
|
108
|
+
"consumes" => :CONSUMES_R,
|
109
|
+
"produces" => :PRODUCES_R,
|
110
|
+
"site" => :SITE_R,
|
111
|
+
}.each do |string, name|
|
112
|
+
it "should lex a (future reserved) keyword from '#{string}'" do
|
113
|
+
expect(tokens_scanned_from(string)).to match_tokens2(name)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'when app_managment is (turned) on' do
|
119
|
+
before(:each) do
|
120
|
+
with_app_management(true)
|
121
|
+
end
|
122
|
+
|
123
|
+
after(:each) do
|
124
|
+
with_app_management(false)
|
125
|
+
end
|
126
|
+
|
127
|
+
{
|
128
|
+
"application" => :APPLICATION,
|
129
|
+
"consumes" => :CONSUMES,
|
130
|
+
"produces" => :PRODUCES,
|
131
|
+
"site" => :SITE,
|
132
|
+
}.each do |string, name|
|
133
|
+
it "should lex a keyword from '#{string}'" do
|
134
|
+
expect(tokens_scanned_from(string)).to match_tokens2(name)
|
135
|
+
end
|
110
136
|
end
|
111
137
|
end
|
112
138
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'puppet/pops'
|
4
|
+
require_relative './parser_rspec_helper'
|
5
|
+
|
6
|
+
describe "egrammar parsing of 'application'" do
|
7
|
+
include ParserRspecHelper
|
8
|
+
|
9
|
+
before(:each) do
|
10
|
+
with_app_management(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
with_app_management(false)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "an empty body" do
|
18
|
+
expect(dump(parse("application foo { }"))).to eq("(application foo () ())")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "an empty body" do
|
22
|
+
prog = <<-EPROG
|
23
|
+
application foo {
|
24
|
+
db { one:
|
25
|
+
password => 'secret'
|
26
|
+
}
|
27
|
+
}
|
28
|
+
EPROG
|
29
|
+
expect(dump(parse(prog))).to eq( [
|
30
|
+
"(application foo () (block",
|
31
|
+
" (resource db",
|
32
|
+
" (one",
|
33
|
+
" (password => 'secret')))", "))" ].join("\n"))
|
34
|
+
end
|
35
|
+
|
36
|
+
it "accepts parameters" do
|
37
|
+
s = "application foo($p1 = 'yo', $p2) { }"
|
38
|
+
expect(dump(parse(s))).to eq("(application foo ((= p1 'yo') p2) ())")
|
39
|
+
end
|
40
|
+
end
|
@@ -175,6 +175,10 @@ describe "egrammar parsing basic expressions" do
|
|
175
175
|
expect(dump(parse("$a = $b[2]"))).to eq("(= $a (slice $b 2))")
|
176
176
|
end
|
177
177
|
|
178
|
+
it "$a = $b[2,]" do
|
179
|
+
expect(dump(parse("$a = $b[2,]"))).to eq("(= $a (slice $b 2))")
|
180
|
+
end
|
181
|
+
|
178
182
|
it "$a = [1, 2, 3][2]" do
|
179
183
|
expect(dump(parse("$a = [1,2,3][2]"))).to eq("(= $a (slice ([] 1 2 3) 2))")
|
180
184
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'puppet/pops'
|
4
|
+
|
5
|
+
# relative to this spec file (./) does not work as this file is loaded by rspec
|
6
|
+
require File.join(File.dirname(__FILE__), '/parser_rspec_helper')
|
7
|
+
|
8
|
+
describe "egrammar parsing of capability mappings" do
|
9
|
+
include ParserRspecHelper
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
with_app_management(true)
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:each) do
|
16
|
+
with_app_management(false)
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when parsing 'produces'" do
|
20
|
+
it "the ast contains produces and attributes" do
|
21
|
+
prog = "Foo produces Sql { name => value }"
|
22
|
+
ast = "(produces Foo Sql ((name => value)))"
|
23
|
+
expect(dump(parse(prog))).to eq(ast)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "optional end comma is allowed" do
|
27
|
+
prog = "Foo produces Sql { name => value, }"
|
28
|
+
ast = "(produces Foo Sql ((name => value)))"
|
29
|
+
expect(dump(parse(prog))).to eq(ast)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when parsing 'consumes'" do
|
34
|
+
it "the ast contains consumes and attributes" do
|
35
|
+
prog = "Foo consumes Sql { name => value }"
|
36
|
+
ast = "(consumes Foo Sql ((name => value)))"
|
37
|
+
expect(dump(parse(prog))).to eq(ast)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "optional end comma is allowed" do
|
41
|
+
prog = "Foo consumes Sql { name => value, }"
|
42
|
+
ast = "(consumes Foo Sql ((name => value)))"
|
43
|
+
expect(dump(parse(prog))).to eq(ast)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
require 'spec_helper'
|
3
|
+
require 'puppet/pops'
|
4
|
+
|
5
|
+
# relative to this spec file (./) does not work as this file is loaded by rspec
|
6
|
+
require File.join(File.dirname(__FILE__), '/parser_rspec_helper')
|
7
|
+
|
8
|
+
describe "egrammar parsing of site expression" do
|
9
|
+
include ParserRspecHelper
|
10
|
+
|
11
|
+
before(:each) do
|
12
|
+
with_app_management(true)
|
13
|
+
end
|
14
|
+
|
15
|
+
after(:each) do
|
16
|
+
with_app_management(false)
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when parsing 'site'" do
|
20
|
+
it "an empty body is allowed" do
|
21
|
+
prog = "site { }"
|
22
|
+
ast = "(site ())"
|
23
|
+
expect(dump(parse(prog))).to eq(ast)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "a body with one expression is allowed" do
|
27
|
+
prog = "site { $x = 1 }"
|
28
|
+
ast = "(site (block\n (= $x 1)\n))"
|
29
|
+
expect(dump(parse(prog))).to eq(ast)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "a body with more than one expression is allowed" do
|
33
|
+
prog = "site { $x = 1 $y = 2}"
|
34
|
+
ast = "(site (block\n (= $x 1)\n (= $y 2)\n))"
|
35
|
+
expect(dump(parse(prog))).to eq(ast)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -4,6 +4,11 @@ require File.join(File.dirname(__FILE__), '/../factory_rspec_helper')
|
|
4
4
|
|
5
5
|
module ParserRspecHelper
|
6
6
|
include FactoryRspecHelper
|
7
|
+
|
8
|
+
def with_app_management(flag)
|
9
|
+
Puppet[:app_management] = flag
|
10
|
+
end
|
11
|
+
|
7
12
|
def parse(code)
|
8
13
|
parser = Puppet::Pops::Parser::Parser.new()
|
9
14
|
parser.parse_string(code)
|
@@ -44,4 +44,22 @@ describe Puppet::Pops::Parser::Parser do
|
|
44
44
|
expect(the_error.line).to eq(1)
|
45
45
|
expect(the_error.pos).to eq(6)
|
46
46
|
end
|
47
|
+
|
48
|
+
it "should raise an error with position information when error is raised on token" do
|
49
|
+
parser = Puppet::Pops::Parser::Parser.new()
|
50
|
+
the_error = nil
|
51
|
+
begin
|
52
|
+
parser.parse_string(<<-EOF, 'fakefile.pp')
|
53
|
+
class whoops($a,$b,$c) {
|
54
|
+
$d = "oh noes", "b"
|
55
|
+
}
|
56
|
+
EOF
|
57
|
+
rescue Puppet::ParseError => e
|
58
|
+
the_error = e
|
59
|
+
end
|
60
|
+
expect(the_error).to be_a(Puppet::ParseError)
|
61
|
+
expect(the_error.file).to eq('fakefile.pp')
|
62
|
+
expect(the_error.line).to eq(2)
|
63
|
+
expect(the_error.pos).to eq(17)
|
64
|
+
end
|
47
65
|
end
|
@@ -2,16 +2,10 @@ require 'spec_helper'
|
|
2
2
|
require 'puppet/pops'
|
3
3
|
|
4
4
|
describe 'The type calculator' do
|
5
|
-
let(:calculator) {
|
5
|
+
let(:calculator) { Puppet::Pops::Types::TypeCalculator.new }
|
6
6
|
|
7
7
|
def range_t(from, to)
|
8
|
-
|
9
|
-
t.from = from
|
10
|
-
t.to = to
|
11
|
-
t
|
12
|
-
end
|
13
|
-
def constrained_t(t, from, to)
|
14
|
-
Puppet::Pops::Types::TypeFactory.constrain_size(t, from, to)
|
8
|
+
Puppet::Pops::Types::PIntegerType.new(from, to)
|
15
9
|
end
|
16
10
|
|
17
11
|
def pattern_t(*patterns)
|
@@ -23,22 +17,19 @@ describe 'The type calculator' do
|
|
23
17
|
end
|
24
18
|
|
25
19
|
def string_t(*strings)
|
26
|
-
Puppet::Pops::Types::TypeFactory.string(*strings)
|
20
|
+
Puppet::Pops::Types::TypeFactory.string(nil, *strings)
|
27
21
|
end
|
28
22
|
|
29
|
-
def
|
30
|
-
Puppet::Pops::Types::TypeFactory.
|
31
|
-
end
|
32
|
-
def all_callables_t(*params)
|
33
|
-
Puppet::Pops::Types::TypeFactory.all_callables()
|
23
|
+
def constrained_string_t(size_type, *strings)
|
24
|
+
Puppet::Pops::Types::TypeFactory.string(size_type, *strings)
|
34
25
|
end
|
35
26
|
|
36
|
-
def
|
37
|
-
Puppet::Pops::Types::TypeFactory.
|
27
|
+
def callable_t(*params)
|
28
|
+
Puppet::Pops::Types::TypeFactory.callable(*params)
|
38
29
|
end
|
39
30
|
|
40
|
-
def
|
41
|
-
Puppet::Pops::Types::TypeFactory.
|
31
|
+
def all_callables_t
|
32
|
+
Puppet::Pops::Types::TypeFactory.all_callables
|
42
33
|
end
|
43
34
|
|
44
35
|
def enum_t(*strings)
|
@@ -49,32 +40,40 @@ describe 'The type calculator' do
|
|
49
40
|
Puppet::Pops::Types::TypeFactory.variant(*types)
|
50
41
|
end
|
51
42
|
|
52
|
-
def integer_t
|
53
|
-
Puppet::Pops::Types::TypeFactory.integer
|
43
|
+
def integer_t
|
44
|
+
Puppet::Pops::Types::TypeFactory.integer
|
45
|
+
end
|
46
|
+
|
47
|
+
def array_t(t, s = nil)
|
48
|
+
Puppet::Pops::Types::TypeFactory.array_of(t, s)
|
54
49
|
end
|
55
50
|
|
56
|
-
def
|
57
|
-
|
51
|
+
def empty_array_t
|
52
|
+
empty_array = array_t(unit_t, range_t(0,0))
|
58
53
|
end
|
59
54
|
|
60
|
-
def hash_t(k,v)
|
61
|
-
Puppet::Pops::Types::TypeFactory.hash_of(v, k)
|
55
|
+
def hash_t(k,v,s = nil)
|
56
|
+
Puppet::Pops::Types::TypeFactory.hash_of(v, k, s)
|
62
57
|
end
|
63
58
|
|
64
|
-
def data_t
|
65
|
-
Puppet::Pops::Types::TypeFactory.data
|
59
|
+
def data_t
|
60
|
+
Puppet::Pops::Types::TypeFactory.data
|
66
61
|
end
|
67
62
|
|
68
|
-
def factory
|
63
|
+
def factory
|
69
64
|
Puppet::Pops::Types::TypeFactory
|
70
65
|
end
|
71
66
|
|
72
|
-
def collection_t()
|
73
|
-
Puppet::Pops::Types::TypeFactory.collection()
|
67
|
+
def collection_t(size_type = nil)
|
68
|
+
Puppet::Pops::Types::TypeFactory.collection(size_type)
|
74
69
|
end
|
75
70
|
|
76
71
|
def tuple_t(*types)
|
77
|
-
Puppet::Pops::Types::TypeFactory.tuple(
|
72
|
+
Puppet::Pops::Types::TypeFactory.tuple(types)
|
73
|
+
end
|
74
|
+
|
75
|
+
def constrained_tuple_t(size_type, *types)
|
76
|
+
Puppet::Pops::Types::TypeFactory.tuple(types, size_type)
|
78
77
|
end
|
79
78
|
|
80
79
|
def struct_t(type_hash)
|
@@ -82,7 +81,7 @@ describe 'The type calculator' do
|
|
82
81
|
end
|
83
82
|
|
84
83
|
def object_t
|
85
|
-
Puppet::Pops::Types::TypeFactory.any
|
84
|
+
Puppet::Pops::Types::TypeFactory.any
|
86
85
|
end
|
87
86
|
|
88
87
|
def optional_t(t)
|
@@ -99,14 +98,14 @@ describe 'The type calculator' do
|
|
99
98
|
|
100
99
|
def unit_t
|
101
100
|
# Cannot be created via factory, the type is private to the type system
|
102
|
-
Puppet::Pops::Types::PUnitType
|
101
|
+
Puppet::Pops::Types::PUnitType::DEFAULT
|
103
102
|
end
|
104
103
|
|
105
104
|
def types
|
106
105
|
Puppet::Pops::Types
|
107
106
|
end
|
108
107
|
|
109
|
-
shared_context
|
108
|
+
shared_context 'types_setup' do
|
110
109
|
|
111
110
|
# Do not include the special type Unit in this list
|
112
111
|
def all_types
|
@@ -186,18 +185,16 @@ describe 'The type calculator' do
|
|
186
185
|
def data_compatible_types
|
187
186
|
result = scalar_types
|
188
187
|
result << Puppet::Pops::Types::PDataType
|
189
|
-
result << array_t(types::PDataType
|
188
|
+
result << array_t(types::PDataType::DEFAULT)
|
190
189
|
result << types::TypeFactory.hash_of_data
|
191
190
|
result << Puppet::Pops::Types::PUndefType
|
192
191
|
result << not_undef_t(types::PDataType.new)
|
193
|
-
|
194
|
-
result << (tmp)
|
195
|
-
tmp.size_type = range_t(0, nil)
|
192
|
+
result << constrained_tuple_t(range_t(0, nil), types::PDataType::DEFAULT)
|
196
193
|
result
|
197
194
|
end
|
198
195
|
|
199
196
|
def type_from_class(c)
|
200
|
-
c.is_a?(Class) ? c
|
197
|
+
c.is_a?(Class) ? c::DEFAULT : c
|
201
198
|
end
|
202
199
|
end
|
203
200
|
|
@@ -255,6 +252,30 @@ describe 'The type calculator' do
|
|
255
252
|
expect(t.runtime_type_name).to eq('Foo')
|
256
253
|
end
|
257
254
|
|
255
|
+
it 'Class Foo translates to PType[PRuntimeType[ruby, Foo]]' do
|
256
|
+
class Foo
|
257
|
+
end
|
258
|
+
|
259
|
+
t = calculator.infer(Foo)
|
260
|
+
expect(t.class).to eq(Puppet::Pops::Types::PType)
|
261
|
+
tt = t.type
|
262
|
+
expect(tt.class).to eq(Puppet::Pops::Types::PRuntimeType)
|
263
|
+
expect(tt.runtime).to eq(:ruby)
|
264
|
+
expect(tt.runtime_type_name).to eq('Foo')
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'Module FooModule translates to PType[PRuntimeType[ruby, FooModule]]' do
|
268
|
+
module FooModule
|
269
|
+
end
|
270
|
+
|
271
|
+
t = calculator.infer(FooModule)
|
272
|
+
expect(t.class).to eq(Puppet::Pops::Types::PType)
|
273
|
+
tt = t.type
|
274
|
+
expect(tt.class).to eq(Puppet::Pops::Types::PRuntimeType)
|
275
|
+
expect(tt.runtime).to eq(:ruby)
|
276
|
+
expect(tt.runtime_type_name).to eq('FooModule')
|
277
|
+
end
|
278
|
+
|
258
279
|
context 'array' do
|
259
280
|
it 'translates to PArrayType' do
|
260
281
|
expect(calculator.infer([1,2]).class).to eq(Puppet::Pops::Types::PArrayType)
|
@@ -275,7 +296,7 @@ describe 'The type calculator' do
|
|
275
296
|
expect(t.to).to eq(42)
|
276
297
|
end
|
277
298
|
|
278
|
-
it
|
299
|
+
it 'Compound string values are computed' do
|
279
300
|
t = calculator.infer(['a','b', 'c']).element_type
|
280
301
|
expect(t.class).to eq(Puppet::Pops::Types::PStringType)
|
281
302
|
expect(t.values).to eq(['a', 'b', 'c'])
|
@@ -380,7 +401,7 @@ describe 'The type calculator' do
|
|
380
401
|
end
|
381
402
|
|
382
403
|
it 'when empty is not assignable to a PHashType with from size > 0' do
|
383
|
-
expect(calculator.assignable?(
|
404
|
+
expect(calculator.assignable?(hash_t(string_t,string_t,range_t(1, 1)), calculator.infer({}))).to eq(false)
|
384
405
|
end
|
385
406
|
|
386
407
|
context 'using infer_set' do
|
@@ -414,7 +435,7 @@ describe 'The type calculator' do
|
|
414
435
|
end
|
415
436
|
|
416
437
|
context 'patterns' do
|
417
|
-
it
|
438
|
+
it 'constructs a PPatternType' do
|
418
439
|
t = pattern_t('a(b)c')
|
419
440
|
expect(t.class).to eq(Puppet::Pops::Types::PPatternType)
|
420
441
|
expect(t.patterns.size).to eq(1)
|
@@ -423,58 +444,46 @@ describe 'The type calculator' do
|
|
423
444
|
expect(t.patterns[0].regexp.match('abc')[1]).to eq('b')
|
424
445
|
end
|
425
446
|
|
426
|
-
it
|
447
|
+
it 'constructs a PStringType with multiple strings' do
|
427
448
|
t = string_t('a', 'b', 'c', 'abc')
|
428
|
-
expect(t.values).to eq(['a', 'b', 'c', 'abc'])
|
449
|
+
expect(t.values).to eq(['a', 'b', 'c', 'abc'].sort)
|
429
450
|
end
|
430
451
|
end
|
431
452
|
|
432
453
|
# Deal with cases not covered by computing common type
|
433
454
|
context 'when computing common type' do
|
434
455
|
it 'computes given resource type commonality' do
|
435
|
-
r1 = Puppet::Pops::Types::PResourceType.new()
|
436
|
-
|
437
|
-
r2
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
r2
|
442
|
-
|
443
|
-
|
444
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("File")
|
445
|
-
|
446
|
-
r1 = Puppet::Pops::Types::PResourceType.new()
|
447
|
-
r1.type_name = 'File'
|
448
|
-
r1.title = '/tmp/foo'
|
456
|
+
r1 = Puppet::Pops::Types::PResourceType.new('File', nil)
|
457
|
+
r2 = Puppet::Pops::Types::PResourceType.new('File', nil)
|
458
|
+
expect(calculator.string(calculator.common_type(r1, r2))).to eq('File')
|
459
|
+
|
460
|
+
|
461
|
+
r2 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
|
462
|
+
expect(calculator.string(calculator.common_type(r1, r2))).to eq('File')
|
463
|
+
|
464
|
+
r1 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
|
449
465
|
expect(calculator.string(calculator.common_type(r1, r2))).to eq("File['/tmp/foo']")
|
450
466
|
|
451
|
-
r1 = Puppet::Pops::Types::PResourceType.new()
|
452
|
-
r1.
|
453
|
-
r1.title = '/tmp/bar'
|
454
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("File")
|
467
|
+
r1 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/bar')
|
468
|
+
expect(calculator.string(calculator.common_type(r1, r2))).to eq('File')
|
455
469
|
|
456
|
-
r2 = Puppet::Pops::Types::PResourceType.new()
|
457
|
-
r2.
|
458
|
-
r2.title = 'apache'
|
459
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("Resource")
|
470
|
+
r2 = Puppet::Pops::Types::PResourceType.new('Package', 'apache')
|
471
|
+
expect(calculator.string(calculator.common_type(r1, r2))).to eq('Resource')
|
460
472
|
end
|
461
473
|
|
462
474
|
it 'computes given hostclass type commonality' do
|
463
|
-
r1 = Puppet::Pops::Types::PHostClassType.new()
|
464
|
-
|
465
|
-
r2
|
466
|
-
r2.class_name = 'foo'
|
467
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("Class[foo]")
|
475
|
+
r1 = Puppet::Pops::Types::PHostClassType.new('foo')
|
476
|
+
r2 = Puppet::Pops::Types::PHostClassType.new('foo')
|
477
|
+
expect(calculator.string(calculator.common_type(r1, r2))).to eq('Class[foo]')
|
468
478
|
|
469
|
-
r2 = Puppet::Pops::Types::PHostClassType.new()
|
470
|
-
r2.
|
471
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("Class")
|
479
|
+
r2 = Puppet::Pops::Types::PHostClassType.new('bar')
|
480
|
+
expect(calculator.string(calculator.common_type(r1, r2))).to eq('Class')
|
472
481
|
|
473
|
-
r2 = Puppet::Pops::Types::PHostClassType.new()
|
474
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq(
|
482
|
+
r2 = Puppet::Pops::Types::PHostClassType.new(nil)
|
483
|
+
expect(calculator.string(calculator.common_type(r1, r2))).to eq('Class')
|
475
484
|
|
476
|
-
r1 = Puppet::Pops::Types::PHostClassType.new()
|
477
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq(
|
485
|
+
r1 = Puppet::Pops::Types::PHostClassType.new(nil)
|
486
|
+
expect(calculator.string(calculator.common_type(r1, r2))).to eq('Class')
|
478
487
|
end
|
479
488
|
|
480
489
|
context 'of strings' do
|
@@ -487,10 +496,8 @@ describe 'The type calculator' do
|
|
487
496
|
end
|
488
497
|
|
489
498
|
it 'computes common size_type' do
|
490
|
-
t1 =
|
491
|
-
|
492
|
-
t2 = string_t
|
493
|
-
t2.size_type = range_t(2,4)
|
499
|
+
t1 = constrained_string_t(range_t(3,6))
|
500
|
+
t2 = constrained_string_t(range_t(2,4))
|
494
501
|
common_t = calculator.common_type(t1,t2)
|
495
502
|
expect(common_t.class).to eq(Puppet::Pops::Types::PStringType)
|
496
503
|
expect(common_t.size_type).to eq(range_t(2,6))
|
@@ -498,18 +505,15 @@ describe 'The type calculator' do
|
|
498
505
|
|
499
506
|
it 'computes common size_type to be undef when one of the types has no size_type' do
|
500
507
|
t1 = string_t
|
501
|
-
t2 =
|
502
|
-
t2.size_type = range_t(2,4)
|
508
|
+
t2 = constrained_string_t(range_t(2,4))
|
503
509
|
common_t = calculator.common_type(t1,t2)
|
504
510
|
expect(common_t.class).to eq(Puppet::Pops::Types::PStringType)
|
505
511
|
expect(common_t.size_type).to be_nil
|
506
512
|
end
|
507
513
|
|
508
514
|
it 'computes values to be empty if the one has empty values' do
|
509
|
-
t1 =
|
510
|
-
|
511
|
-
t2 = string_t
|
512
|
-
t2.size_type = range_t(2,4)
|
515
|
+
t1 = constrained_string_t(range_t(3,6), 'apa')
|
516
|
+
t2 = constrained_string_t(range_t(2,4))
|
513
517
|
common_t = calculator.common_type(t1,t2)
|
514
518
|
expect(common_t.class).to eq(Puppet::Pops::Types::PStringType)
|
515
519
|
expect(common_t.values).to be_empty
|
@@ -522,7 +526,7 @@ describe 'The type calculator' do
|
|
522
526
|
common_t = calculator.common_type(t1,t2)
|
523
527
|
expect(common_t.class).to eq(Puppet::Pops::Types::PPatternType)
|
524
528
|
expect(common_t.patterns.map { |pr| pr.pattern }).to eq(['abc', 'xyz'])
|
525
|
-
expect(calculator.string(common_t)).to eq(
|
529
|
+
expect(calculator.string(common_t)).to eq('Pattern[/abc/, /xyz/]')
|
526
530
|
end
|
527
531
|
|
528
532
|
it 'computes enum commonality to value set sum' do
|
@@ -533,7 +537,7 @@ describe 'The type calculator' do
|
|
533
537
|
end
|
534
538
|
|
535
539
|
it 'computed variant commonality to type union where added types are not sub-types' do
|
536
|
-
a_t1 = integer_t
|
540
|
+
a_t1 = integer_t
|
537
541
|
a_t2 = enum_t('b')
|
538
542
|
v_a = variant_t(a_t1, a_t2)
|
539
543
|
b_t1 = enum_t('a')
|
@@ -544,8 +548,8 @@ describe 'The type calculator' do
|
|
544
548
|
end
|
545
549
|
|
546
550
|
it 'computed variant commonality to type union where added types are sub-types' do
|
547
|
-
a_t1 = integer_t
|
548
|
-
a_t2 = string_t
|
551
|
+
a_t1 = integer_t
|
552
|
+
a_t2 = string_t
|
549
553
|
v_a = variant_t(a_t1, a_t2)
|
550
554
|
b_t1 = enum_t('a')
|
551
555
|
v_b = variant_t(b_t1)
|
@@ -554,7 +558,7 @@ describe 'The type calculator' do
|
|
554
558
|
expect(Set.new(common_t.types)).to eq(Set.new([a_t1, a_t2]))
|
555
559
|
end
|
556
560
|
|
557
|
-
context
|
561
|
+
context 'of callables' do
|
558
562
|
it 'incompatible instances => generic callable' do
|
559
563
|
t1 = callable_t(String)
|
560
564
|
t2 = callable_t(Integer)
|
@@ -576,8 +580,10 @@ describe 'The type calculator' do
|
|
576
580
|
end
|
577
581
|
|
578
582
|
it 'block_type is included in the check (incompatible block)' do
|
579
|
-
|
580
|
-
|
583
|
+
b1 = callable_t(String)
|
584
|
+
b2 = callable_t(Integer)
|
585
|
+
t1 = callable_t(String, b1)
|
586
|
+
t2 = callable_t(String, b2)
|
581
587
|
common_t = calculator.common_type(t1, t2)
|
582
588
|
expect(common_t.class).to be(Puppet::Pops::Types::PCallableType)
|
583
589
|
expect(common_t.param_types).to be_nil
|
@@ -585,9 +591,11 @@ describe 'The type calculator' do
|
|
585
591
|
end
|
586
592
|
|
587
593
|
it 'block_type is included in the check (compatible block)' do
|
588
|
-
|
589
|
-
|
590
|
-
|
594
|
+
b1 = callable_t(String)
|
595
|
+
t1 = callable_t(String, b1)
|
596
|
+
scalar_t = Puppet::Pops::Types::PScalarType::DEFAULT
|
597
|
+
b2 = callable_t(scalar_t)
|
598
|
+
t2 = callable_t(String, b2)
|
591
599
|
common_t = calculator.common_type(t1, t2)
|
592
600
|
expect(common_t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
|
593
601
|
expect(common_t.block_type).to eql(callable_t(scalar_t))
|
@@ -596,43 +604,43 @@ describe 'The type calculator' do
|
|
596
604
|
end
|
597
605
|
|
598
606
|
context 'computes assignability' do
|
599
|
-
include_context
|
607
|
+
include_context 'types_setup'
|
600
608
|
|
601
609
|
it 'such that all types are assignable to themselves' do
|
602
610
|
all_types.each do |tc|
|
603
|
-
t = tc
|
611
|
+
t = tc::DEFAULT
|
604
612
|
expect(t).to be_assignable_to(t)
|
605
613
|
end
|
606
614
|
end
|
607
615
|
|
608
616
|
context 'for Unit, such that' do
|
609
617
|
it 'all types are assignable to Unit' do
|
610
|
-
t = Puppet::Pops::Types::PUnitType
|
611
|
-
all_types.each { |t2| expect(t2
|
618
|
+
t = Puppet::Pops::Types::PUnitType::DEFAULT
|
619
|
+
all_types.each { |t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
612
620
|
end
|
613
621
|
|
614
622
|
it 'Unit is assignable to all other types' do
|
615
|
-
t = Puppet::Pops::Types::PUnitType
|
616
|
-
all_types.each { |t2| expect(t).to be_assignable_to(t2
|
623
|
+
t = Puppet::Pops::Types::PUnitType::DEFAULT
|
624
|
+
all_types.each { |t2| expect(t).to be_assignable_to(t2::DEFAULT) }
|
617
625
|
end
|
618
626
|
|
619
627
|
it 'Unit is assignable to Unit' do
|
620
|
-
t = Puppet::Pops::Types::PUnitType
|
621
|
-
t2 = Puppet::Pops::Types::PUnitType
|
628
|
+
t = Puppet::Pops::Types::PUnitType::DEFAULT
|
629
|
+
t2 = Puppet::Pops::Types::PUnitType::DEFAULT
|
622
630
|
expect(t).to be_assignable_to(t2)
|
623
631
|
end
|
624
632
|
end
|
625
633
|
|
626
|
-
context
|
634
|
+
context 'for Any, such that' do
|
627
635
|
it 'all types are assignable to Any' do
|
628
|
-
t = Puppet::Pops::Types::PAnyType
|
629
|
-
all_types.each { |t2| expect(t2
|
636
|
+
t = Puppet::Pops::Types::PAnyType::DEFAULT
|
637
|
+
all_types.each { |t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
630
638
|
end
|
631
639
|
|
632
640
|
it 'Any is not assignable to anything but Any and Optional (implied Optional[Any])' do
|
633
641
|
tested_types = all_types() - [Puppet::Pops::Types::PAnyType, Puppet::Pops::Types::POptionalType]
|
634
|
-
t = Puppet::Pops::Types::PAnyType
|
635
|
-
tested_types.each { |t2| expect(t).not_to be_assignable_to(t2
|
642
|
+
t = Puppet::Pops::Types::PAnyType::DEFAULT
|
643
|
+
tested_types.each { |t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
636
644
|
end
|
637
645
|
end
|
638
646
|
|
@@ -640,9 +648,9 @@ describe 'The type calculator' do
|
|
640
648
|
it 'all types except types assignable from Undef are assignable to NotUndef' do
|
641
649
|
t = not_undef_t
|
642
650
|
tc = Puppet::Pops::Types::TypeCalculator.singleton
|
643
|
-
undef_t = Puppet::Pops::Types::PUndefType
|
644
|
-
all_types
|
645
|
-
t2 = c
|
651
|
+
undef_t = Puppet::Pops::Types::PUndefType::DEFAULT
|
652
|
+
all_types.each do |c|
|
653
|
+
t2 = c::DEFAULT
|
646
654
|
if tc.assignable?(t2, undef_t)
|
647
655
|
expect(t2).not_to be_assignable_to(t)
|
648
656
|
else
|
@@ -653,9 +661,9 @@ describe 'The type calculator' do
|
|
653
661
|
|
654
662
|
it 'type NotUndef[T] is assignable from T unless T is assignable from Undef ' do
|
655
663
|
tc = Puppet::Pops::Types::TypeCalculator.singleton
|
656
|
-
undef_t = Puppet::Pops::Types::PUndefType
|
664
|
+
undef_t = Puppet::Pops::Types::PUndefType::DEFAULT
|
657
665
|
all_types().select do |c|
|
658
|
-
t2 = c
|
666
|
+
t2 = c::DEFAULT
|
659
667
|
not_undef_t = not_undef_t(t2)
|
660
668
|
if tc.assignable?(t2, undef_t)
|
661
669
|
expect(t2).not_to be_assignable_to(not_undef_t)
|
@@ -667,9 +675,9 @@ describe 'The type calculator' do
|
|
667
675
|
|
668
676
|
it 'type T is assignable from NotUndef[T] unless T is assignable from Undef' do
|
669
677
|
tc = Puppet::Pops::Types::TypeCalculator.singleton
|
670
|
-
undef_t = Puppet::Pops::Types::PUndefType
|
678
|
+
undef_t = Puppet::Pops::Types::PUndefType::DEFAULT
|
671
679
|
all_types().select do |c|
|
672
|
-
t2 = c
|
680
|
+
t2 = c::DEFAULT
|
673
681
|
not_undef_t = not_undef_t(t2)
|
674
682
|
unless tc.assignable?(t2, undef_t)
|
675
683
|
expect(not_undef_t).to be_assignable_to(t2)
|
@@ -678,35 +686,35 @@ describe 'The type calculator' do
|
|
678
686
|
end
|
679
687
|
end
|
680
688
|
|
681
|
-
context
|
689
|
+
context 'for Data, such that' do
|
682
690
|
it 'all scalars + array and hash are assignable to Data' do
|
683
|
-
t = Puppet::Pops::Types::PDataType
|
691
|
+
t = Puppet::Pops::Types::PDataType::DEFAULT
|
684
692
|
data_compatible_types.each { |t2|
|
685
693
|
expect(type_from_class(t2)).to be_assignable_to(t)
|
686
694
|
}
|
687
695
|
end
|
688
696
|
|
689
697
|
it 'a Variant of scalar, hash, or array is assignable to Data' do
|
690
|
-
t = Puppet::Pops::Types::PDataType
|
698
|
+
t = Puppet::Pops::Types::PDataType::DEFAULT
|
691
699
|
data_compatible_types.each { |t2| expect(variant_t(type_from_class(t2))).to be_assignable_to(t) }
|
692
700
|
end
|
693
701
|
|
694
702
|
it 'Data is not assignable to any of its subtypes' do
|
695
|
-
t = Puppet::Pops::Types::PDataType
|
703
|
+
t = Puppet::Pops::Types::PDataType::DEFAULT
|
696
704
|
types_to_test = data_compatible_types- [Puppet::Pops::Types::PDataType]
|
697
705
|
types_to_test.each {|t2| expect(t).not_to be_assignable_to(type_from_class(t2)) }
|
698
706
|
end
|
699
707
|
|
700
708
|
it 'Data is not assignable to a Variant of Data subtype' do
|
701
|
-
t = Puppet::Pops::Types::PDataType
|
709
|
+
t = Puppet::Pops::Types::PDataType::DEFAULT
|
702
710
|
types_to_test = data_compatible_types- [Puppet::Pops::Types::PDataType]
|
703
711
|
types_to_test.each { |t2| expect(t).not_to be_assignable_to(variant_t(type_from_class(t2))) }
|
704
712
|
end
|
705
713
|
|
706
714
|
it 'Data is not assignable to any disjunct type' do
|
707
715
|
tested_types = all_types - [Puppet::Pops::Types::PAnyType, Puppet::Pops::Types::POptionalType, Puppet::Pops::Types::PDataType] - scalar_types
|
708
|
-
t = Puppet::Pops::Types::PDataType
|
709
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
716
|
+
t = Puppet::Pops::Types::PDataType::DEFAULT
|
717
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
710
718
|
end
|
711
719
|
end
|
712
720
|
|
@@ -728,35 +736,35 @@ describe 'The type calculator' do
|
|
728
736
|
end
|
729
737
|
end
|
730
738
|
|
731
|
-
context
|
732
|
-
it
|
733
|
-
t = Puppet::Pops::Types::PScalarType
|
734
|
-
scalar_types.each {|t2| expect(t2
|
739
|
+
context 'for Scalar, such that' do
|
740
|
+
it 'all scalars are assignable to Scalar' do
|
741
|
+
t = Puppet::Pops::Types::PScalarType::DEFAULT
|
742
|
+
scalar_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
735
743
|
end
|
736
744
|
|
737
745
|
it 'Scalar is not assignable to any of its subtypes' do
|
738
|
-
t = Puppet::Pops::Types::PScalarType
|
746
|
+
t = Puppet::Pops::Types::PScalarType::DEFAULT
|
739
747
|
types_to_test = scalar_types - [Puppet::Pops::Types::PScalarType]
|
740
|
-
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2
|
748
|
+
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
741
749
|
end
|
742
750
|
|
743
751
|
it 'Scalar is not assignable to any disjunct type' do
|
744
752
|
tested_types = all_types - [Puppet::Pops::Types::PAnyType, Puppet::Pops::Types::POptionalType, Puppet::Pops::Types::PNotUndefType, Puppet::Pops::Types::PDataType] - scalar_types
|
745
|
-
t = Puppet::Pops::Types::PScalarType
|
746
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
753
|
+
t = Puppet::Pops::Types::PScalarType::DEFAULT
|
754
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
747
755
|
end
|
748
756
|
end
|
749
757
|
|
750
|
-
context
|
751
|
-
it
|
752
|
-
t = Puppet::Pops::Types::PNumericType
|
753
|
-
numeric_types.each {|t2| expect(t2
|
758
|
+
context 'for Numeric, such that' do
|
759
|
+
it 'all numerics are assignable to Numeric' do
|
760
|
+
t = Puppet::Pops::Types::PNumericType::DEFAULT
|
761
|
+
numeric_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
754
762
|
end
|
755
763
|
|
756
764
|
it 'Numeric is not assignable to any of its subtypes' do
|
757
|
-
t = Puppet::Pops::Types::PNumericType
|
765
|
+
t = Puppet::Pops::Types::PNumericType::DEFAULT
|
758
766
|
types_to_test = numeric_types - [Puppet::Pops::Types::PNumericType]
|
759
|
-
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2
|
767
|
+
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
760
768
|
end
|
761
769
|
|
762
770
|
it 'Numeric is not assignable to any disjunct type' do
|
@@ -767,39 +775,39 @@ describe 'The type calculator' do
|
|
767
775
|
Puppet::Pops::Types::PDataType,
|
768
776
|
Puppet::Pops::Types::PScalarType,
|
769
777
|
] - numeric_types
|
770
|
-
t = Puppet::Pops::Types::PNumericType
|
771
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
778
|
+
t = Puppet::Pops::Types::PNumericType::DEFAULT
|
779
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
772
780
|
end
|
773
781
|
end
|
774
782
|
|
775
|
-
context
|
776
|
-
it
|
777
|
-
t = Puppet::Pops::Types::PCollectionType
|
778
|
-
collection_types.each {|t2| expect(t2
|
783
|
+
context 'for Collection, such that' do
|
784
|
+
it 'all collections are assignable to Collection' do
|
785
|
+
t = Puppet::Pops::Types::PCollectionType::DEFAULT
|
786
|
+
collection_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
779
787
|
end
|
780
788
|
|
781
789
|
it 'Collection is not assignable to any of its subtypes' do
|
782
|
-
t = Puppet::Pops::Types::PCollectionType
|
790
|
+
t = Puppet::Pops::Types::PCollectionType::DEFAULT
|
783
791
|
types_to_test = collection_types - [Puppet::Pops::Types::PCollectionType]
|
784
|
-
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2
|
792
|
+
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
785
793
|
end
|
786
794
|
|
787
795
|
it 'Collection is not assignable to any disjunct type' do
|
788
796
|
tested_types = all_types - [Puppet::Pops::Types::PAnyType, Puppet::Pops::Types::POptionalType, Puppet::Pops::Types::PNotUndefType] - collection_types
|
789
|
-
t = Puppet::Pops::Types::PCollectionType
|
790
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
797
|
+
t = Puppet::Pops::Types::PCollectionType::DEFAULT
|
798
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
791
799
|
end
|
792
800
|
end
|
793
801
|
|
794
|
-
context
|
795
|
-
it
|
796
|
-
t = Puppet::Pops::Types::PArrayType
|
802
|
+
context 'for Array, such that' do
|
803
|
+
it 'Array is not assignable to non Array based Collection type' do
|
804
|
+
t = Puppet::Pops::Types::PArrayType::DEFAULT
|
797
805
|
tested_types = collection_types - [
|
798
806
|
Puppet::Pops::Types::PCollectionType,
|
799
807
|
Puppet::Pops::Types::PNotUndefType,
|
800
808
|
Puppet::Pops::Types::PArrayType,
|
801
809
|
Puppet::Pops::Types::PTupleType]
|
802
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
810
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
803
811
|
end
|
804
812
|
|
805
813
|
it 'Array is not assignable to any disjunct type' do
|
@@ -808,19 +816,24 @@ describe 'The type calculator' do
|
|
808
816
|
Puppet::Pops::Types::POptionalType,
|
809
817
|
Puppet::Pops::Types::PNotUndefType,
|
810
818
|
Puppet::Pops::Types::PDataType] - collection_types
|
811
|
-
t = Puppet::Pops::Types::PArrayType
|
812
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
819
|
+
t = Puppet::Pops::Types::PArrayType::DEFAULT
|
820
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
821
|
+
end
|
822
|
+
|
823
|
+
it 'Empty Array is assignable to an array that accepts 0 entries' do
|
824
|
+
expect(empty_array_t).to be_assignable_to(array_t(string_t))
|
825
|
+
expect(empty_array_t).to be_assignable_to(array_t(integer_t))
|
813
826
|
end
|
814
827
|
end
|
815
828
|
|
816
|
-
context
|
817
|
-
it
|
818
|
-
t = Puppet::Pops::Types::PHashType
|
829
|
+
context 'for Hash, such that' do
|
830
|
+
it 'Hash is not assignable to any other Collection type' do
|
831
|
+
t = Puppet::Pops::Types::PHashType::DEFAULT
|
819
832
|
tested_types = collection_types - [
|
820
833
|
Puppet::Pops::Types::PCollectionType,
|
821
834
|
Puppet::Pops::Types::PStructType,
|
822
835
|
Puppet::Pops::Types::PHashType]
|
823
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
836
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
824
837
|
end
|
825
838
|
|
826
839
|
it 'Hash is not assignable to any disjunct type' do
|
@@ -829,8 +842,8 @@ describe 'The type calculator' do
|
|
829
842
|
Puppet::Pops::Types::POptionalType,
|
830
843
|
Puppet::Pops::Types::PNotUndefType,
|
831
844
|
Puppet::Pops::Types::PDataType] - collection_types
|
832
|
-
t = Puppet::Pops::Types::PHashType
|
833
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
845
|
+
t = Puppet::Pops::Types::PHashType::DEFAULT
|
846
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
834
847
|
end
|
835
848
|
|
836
849
|
it 'Struct is assignable to Hash with Pattern that matches all keys' do
|
@@ -850,14 +863,14 @@ describe 'The type calculator' do
|
|
850
863
|
end
|
851
864
|
end
|
852
865
|
|
853
|
-
context
|
854
|
-
it
|
855
|
-
t = Puppet::Pops::Types::PTupleType
|
866
|
+
context 'for Tuple, such that' do
|
867
|
+
it 'Tuple is not assignable to any other non Array based Collection type' do
|
868
|
+
t = Puppet::Pops::Types::PTupleType::DEFAULT
|
856
869
|
tested_types = collection_types - [
|
857
870
|
Puppet::Pops::Types::PCollectionType,
|
858
871
|
Puppet::Pops::Types::PTupleType,
|
859
872
|
Puppet::Pops::Types::PArrayType]
|
860
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
873
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
861
874
|
end
|
862
875
|
|
863
876
|
it 'Tuple is not assignable to any disjunct type' do
|
@@ -866,19 +879,19 @@ describe 'The type calculator' do
|
|
866
879
|
Puppet::Pops::Types::POptionalType,
|
867
880
|
Puppet::Pops::Types::PNotUndefType,
|
868
881
|
Puppet::Pops::Types::PDataType] - collection_types
|
869
|
-
t = Puppet::Pops::Types::PTupleType
|
870
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
882
|
+
t = Puppet::Pops::Types::PTupleType::DEFAULT
|
883
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
871
884
|
end
|
872
885
|
end
|
873
886
|
|
874
|
-
context
|
875
|
-
it
|
876
|
-
t = Puppet::Pops::Types::PStructType
|
887
|
+
context 'for Struct, such that' do
|
888
|
+
it 'Struct is not assignable to any other non Hashed based Collection type' do
|
889
|
+
t = Puppet::Pops::Types::PStructType::DEFAULT
|
877
890
|
tested_types = collection_types - [
|
878
891
|
Puppet::Pops::Types::PCollectionType,
|
879
892
|
Puppet::Pops::Types::PStructType,
|
880
893
|
Puppet::Pops::Types::PHashType]
|
881
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
894
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
882
895
|
end
|
883
896
|
|
884
897
|
it 'Struct is not assignable to any disjunct type' do
|
@@ -887,8 +900,8 @@ describe 'The type calculator' do
|
|
887
900
|
Puppet::Pops::Types::POptionalType,
|
888
901
|
Puppet::Pops::Types::PNotUndefType,
|
889
902
|
Puppet::Pops::Types::PDataType] - collection_types
|
890
|
-
t = Puppet::Pops::Types::PStructType
|
891
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
903
|
+
t = Puppet::Pops::Types::PStructType::DEFAULT
|
904
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
892
905
|
end
|
893
906
|
|
894
907
|
it 'Default key optionality is controlled by value assignability to undef' do
|
@@ -921,32 +934,32 @@ describe 'The type calculator' do
|
|
921
934
|
end
|
922
935
|
end
|
923
936
|
|
924
|
-
context
|
925
|
-
it
|
926
|
-
t = Puppet::Pops::Types::PCallableType
|
937
|
+
context 'for Callable, such that' do
|
938
|
+
it 'Callable is not assignable to any disjunct type' do
|
939
|
+
t = Puppet::Pops::Types::PCallableType::DEFAULT
|
927
940
|
tested_types = all_types - [
|
928
941
|
Puppet::Pops::Types::PCallableType,
|
929
942
|
Puppet::Pops::Types::PAnyType,
|
930
943
|
Puppet::Pops::Types::POptionalType,
|
931
944
|
Puppet::Pops::Types::PNotUndefType]
|
932
|
-
tested_types.each {|t2| expect(t).to_not be_assignable_to(t2
|
945
|
+
tested_types.each {|t2| expect(t).to_not be_assignable_to(t2::DEFAULT) }
|
933
946
|
end
|
934
947
|
end
|
935
948
|
|
936
949
|
it 'should recognize mapped ruby types' do
|
937
|
-
{ Integer => Puppet::Pops::Types::PIntegerType
|
938
|
-
Fixnum => Puppet::Pops::Types::PIntegerType
|
939
|
-
Bignum => Puppet::Pops::Types::PIntegerType
|
940
|
-
Float => Puppet::Pops::Types::PFloatType
|
941
|
-
Numeric => Puppet::Pops::Types::PNumericType
|
942
|
-
NilClass => Puppet::Pops::Types::PUndefType
|
943
|
-
TrueClass => Puppet::Pops::Types::PBooleanType
|
944
|
-
FalseClass => Puppet::Pops::Types::PBooleanType
|
945
|
-
String => Puppet::Pops::Types::PStringType
|
946
|
-
Regexp => Puppet::Pops::Types::PRegexpType
|
947
|
-
Regexp => Puppet::Pops::Types::PRegexpType
|
948
|
-
Array => Puppet::Pops::Types::TypeFactory.array_of_data
|
949
|
-
Hash => Puppet::Pops::Types::TypeFactory.hash_of_data
|
950
|
+
{ Integer => Puppet::Pops::Types::PIntegerType::DEFAULT,
|
951
|
+
Fixnum => Puppet::Pops::Types::PIntegerType::DEFAULT,
|
952
|
+
Bignum => Puppet::Pops::Types::PIntegerType::DEFAULT,
|
953
|
+
Float => Puppet::Pops::Types::PFloatType::DEFAULT,
|
954
|
+
Numeric => Puppet::Pops::Types::PNumericType::DEFAULT,
|
955
|
+
NilClass => Puppet::Pops::Types::PUndefType::DEFAULT,
|
956
|
+
TrueClass => Puppet::Pops::Types::PBooleanType::DEFAULT,
|
957
|
+
FalseClass => Puppet::Pops::Types::PBooleanType::DEFAULT,
|
958
|
+
String => Puppet::Pops::Types::PStringType::DEFAULT,
|
959
|
+
Regexp => Puppet::Pops::Types::PRegexpType::DEFAULT,
|
960
|
+
Regexp => Puppet::Pops::Types::PRegexpType::DEFAULT,
|
961
|
+
Array => Puppet::Pops::Types::TypeFactory.array_of_data,
|
962
|
+
Hash => Puppet::Pops::Types::TypeFactory.hash_of_data
|
950
963
|
}.each do |ruby_type, puppet_type |
|
951
964
|
expect(ruby_type).to be_assignable_to(puppet_type)
|
952
965
|
end
|
@@ -1049,18 +1062,18 @@ describe 'The type calculator' do
|
|
1049
1062
|
end
|
1050
1063
|
|
1051
1064
|
it 'pattern representing all patterns should accept any pattern' do
|
1052
|
-
expect(calculator.assignable?(pattern_t
|
1053
|
-
expect(calculator.assignable?(pattern_t
|
1065
|
+
expect(calculator.assignable?(pattern_t, pattern_t('a'))).to eq(true)
|
1066
|
+
expect(calculator.assignable?(pattern_t, pattern_t)).to eq(true)
|
1054
1067
|
end
|
1055
1068
|
|
1056
1069
|
it 'pattern representing all patterns should accept any enum' do
|
1057
|
-
expect(calculator.assignable?(pattern_t
|
1058
|
-
expect(calculator.assignable?(pattern_t
|
1070
|
+
expect(calculator.assignable?(pattern_t, enum_t('a'))).to eq(true)
|
1071
|
+
expect(calculator.assignable?(pattern_t, enum_t)).to eq(true)
|
1059
1072
|
end
|
1060
1073
|
|
1061
1074
|
it 'pattern representing all patterns should accept any string' do
|
1062
|
-
expect(calculator.assignable?(pattern_t
|
1063
|
-
expect(calculator.assignable?(pattern_t
|
1075
|
+
expect(calculator.assignable?(pattern_t, string_t('a'))).to eq(true)
|
1076
|
+
expect(calculator.assignable?(pattern_t, string_t)).to eq(true)
|
1064
1077
|
end
|
1065
1078
|
|
1066
1079
|
end
|
@@ -1079,8 +1092,8 @@ describe 'The type calculator' do
|
|
1079
1092
|
end
|
1080
1093
|
|
1081
1094
|
it 'non parameterized enum accepts any other enum but not the reverse' do
|
1082
|
-
expect(calculator.assignable?(enum_t
|
1083
|
-
expect(calculator.assignable?(enum_t('a'), enum_t
|
1095
|
+
expect(calculator.assignable?(enum_t, enum_t('a'))).to eq(true)
|
1096
|
+
expect(calculator.assignable?(enum_t('a'), enum_t)).to eq(false)
|
1084
1097
|
end
|
1085
1098
|
|
1086
1099
|
it 'enum should accept a variant where all variants are acceptable' do
|
@@ -1091,51 +1104,50 @@ describe 'The type calculator' do
|
|
1091
1104
|
|
1092
1105
|
context 'when dealing with string and enum combinations' do
|
1093
1106
|
it 'should accept assigning any enum to unrestricted string' do
|
1094
|
-
expect(calculator.assignable?(string_t
|
1095
|
-
expect(calculator.assignable?(string_t
|
1107
|
+
expect(calculator.assignable?(string_t, enum_t('blue'))).to eq(true)
|
1108
|
+
expect(calculator.assignable?(string_t, enum_t('blue', 'red'))).to eq(true)
|
1096
1109
|
end
|
1097
1110
|
|
1098
1111
|
it 'should not accept assigning longer enum value to size restricted string' do
|
1099
|
-
expect(calculator.assignable?(
|
1112
|
+
expect(calculator.assignable?(constrained_string_t(range_t(2,2)), enum_t('a','blue'))).to eq(false)
|
1100
1113
|
end
|
1101
1114
|
|
1102
1115
|
it 'should accept assigning any string to empty enum' do
|
1103
|
-
expect(calculator.assignable?(enum_t
|
1116
|
+
expect(calculator.assignable?(enum_t, string_t)).to eq(true)
|
1104
1117
|
end
|
1105
1118
|
|
1106
1119
|
it 'should accept assigning empty enum to any string' do
|
1107
|
-
expect(calculator.assignable?(string_t
|
1120
|
+
expect(calculator.assignable?(string_t, enum_t)).to eq(true)
|
1108
1121
|
end
|
1109
1122
|
|
1110
1123
|
it 'should not accept assigning empty enum to size constrained string' do
|
1111
|
-
expect(calculator.assignable?(
|
1124
|
+
expect(calculator.assignable?(constrained_string_t(range_t(2,2)), enum_t)).to eq(false)
|
1112
1125
|
end
|
1113
1126
|
end
|
1114
1127
|
|
1115
1128
|
context 'when dealing with string/pattern/enum combinations' do
|
1116
1129
|
it 'any string is equal to any enum is equal to any pattern' do
|
1117
|
-
expect(calculator.assignable?(string_t
|
1118
|
-
expect(calculator.assignable?(string_t
|
1119
|
-
expect(calculator.assignable?(enum_t
|
1120
|
-
expect(calculator.assignable?(enum_t
|
1121
|
-
expect(calculator.assignable?(pattern_t
|
1122
|
-
expect(calculator.assignable?(pattern_t
|
1130
|
+
expect(calculator.assignable?(string_t, enum_t)).to eq(true)
|
1131
|
+
expect(calculator.assignable?(string_t, pattern_t)).to eq(true)
|
1132
|
+
expect(calculator.assignable?(enum_t, string_t)).to eq(true)
|
1133
|
+
expect(calculator.assignable?(enum_t, pattern_t)).to eq(true)
|
1134
|
+
expect(calculator.assignable?(pattern_t, string_t)).to eq(true)
|
1135
|
+
expect(calculator.assignable?(pattern_t, enum_t)).to eq(true)
|
1123
1136
|
end
|
1124
1137
|
end
|
1125
1138
|
|
1126
1139
|
context 'when dealing with tuples' do
|
1127
1140
|
it 'matches empty tuples' do
|
1128
|
-
tuple1 = tuple_t
|
1129
|
-
tuple2 = tuple_t
|
1141
|
+
tuple1 = tuple_t
|
1142
|
+
tuple2 = tuple_t
|
1130
1143
|
|
1131
1144
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
1132
1145
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
|
1133
1146
|
end
|
1134
1147
|
|
1135
1148
|
it 'accepts an empty tuple as assignable to a tuple with a min size of 0' do
|
1136
|
-
tuple1 =
|
1137
|
-
|
1138
|
-
tuple2 = tuple_t()
|
1149
|
+
tuple1 = constrained_tuple_t(range_t(0, :default), Object)
|
1150
|
+
tuple2 = tuple_t
|
1139
1151
|
|
1140
1152
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
1141
1153
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(false)
|
@@ -1156,62 +1168,51 @@ describe 'The type calculator' do
|
|
1156
1168
|
end
|
1157
1169
|
|
1158
1170
|
it 'should accept ranged tuples' do
|
1159
|
-
tuple1 =
|
1160
|
-
factory.constrain_size(tuple1, 5, 5)
|
1171
|
+
tuple1 = constrained_tuple_t(range_t(5,5), 1)
|
1161
1172
|
tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
|
1162
1173
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
1163
1174
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
|
1164
1175
|
end
|
1165
1176
|
|
1166
1177
|
it 'should reject ranged tuples when ranges does not match' do
|
1167
|
-
tuple1 =
|
1168
|
-
factory.constrain_size(tuple1, 4, 5)
|
1178
|
+
tuple1 = constrained_tuple_t(range_t(4, 5), 1)
|
1169
1179
|
tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
|
1170
1180
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
1171
1181
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(false)
|
1172
1182
|
end
|
1173
1183
|
|
1174
1184
|
it 'should reject ranged tuples when ranges does not match (using infinite upper bound)' do
|
1175
|
-
tuple1 =
|
1176
|
-
factory.constrain_size(tuple1, 4, :default)
|
1185
|
+
tuple1 = constrained_tuple_t(range_t(4, :default), 1)
|
1177
1186
|
tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
|
1178
1187
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
1179
1188
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(false)
|
1180
1189
|
end
|
1181
1190
|
|
1182
1191
|
it 'should accept matching tuples with optional entries by repeating last' do
|
1183
|
-
tuple1 =
|
1184
|
-
|
1185
|
-
tuple2 = tuple_t(Numeric,Numeric)
|
1186
|
-
factory.constrain_size(tuple2, 0, :default)
|
1192
|
+
tuple1 = constrained_tuple_t(range_t(0, :default), 1,2)
|
1193
|
+
tuple2 = constrained_tuple_t(range_t(0, :default), Numeric,Numeric)
|
1187
1194
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(false)
|
1188
1195
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
|
1189
1196
|
end
|
1190
1197
|
|
1191
1198
|
it 'should accept matching tuples with optional entries' do
|
1192
|
-
tuple1 =
|
1193
|
-
|
1194
|
-
array2 = factory.constrain_size(array_t(Integer),2,2)
|
1199
|
+
tuple1 = constrained_tuple_t(range_t(1, 3), Integer, Integer, String)
|
1200
|
+
array2 = array_t(Integer, range_t(2,2))
|
1195
1201
|
expect(calculator.assignable?(tuple1, array2)).to eq(true)
|
1196
|
-
|
1202
|
+
tuple1 = constrained_tuple_t(range_t(3, 3), tuple1.types)
|
1197
1203
|
expect(calculator.assignable?(tuple1, array2)).to eq(false)
|
1198
1204
|
end
|
1199
1205
|
|
1200
1206
|
it 'should accept matching array' do
|
1201
1207
|
tuple1 = tuple_t(1,2)
|
1202
|
-
array = array_t(Integer)
|
1203
|
-
factory.constrain_size(array, 2, 2)
|
1208
|
+
array = array_t(Integer, range_t(2, 2))
|
1204
1209
|
expect(calculator.assignable?(tuple1, array)).to eq(true)
|
1205
1210
|
expect(calculator.assignable?(array, tuple1)).to eq(true)
|
1206
1211
|
end
|
1207
1212
|
|
1208
1213
|
it 'should accept empty array when tuple allows min of 0' do
|
1209
|
-
tuple1 =
|
1210
|
-
|
1211
|
-
|
1212
|
-
array = array_t(Integer)
|
1213
|
-
factory.constrain_size(array, 0, 0)
|
1214
|
-
|
1214
|
+
tuple1 = constrained_tuple_t(range_t(0, 1), Integer)
|
1215
|
+
array = array_t(Integer, range_t(0, 0))
|
1215
1216
|
expect(calculator.assignable?(tuple1, array)).to eq(true)
|
1216
1217
|
expect(calculator.assignable?(array, tuple1)).to eq(false)
|
1217
1218
|
end
|
@@ -1258,18 +1259,15 @@ describe 'The type calculator' do
|
|
1258
1259
|
|
1259
1260
|
it 'should accept matching hash' do
|
1260
1261
|
struct1 = struct_t({'a'=>Integer, 'b'=>Integer})
|
1261
|
-
non_empty_string =
|
1262
|
-
|
1263
|
-
hsh = hash_t(non_empty_string, Integer)
|
1264
|
-
factory.constrain_size(hsh, 2, 2)
|
1262
|
+
non_empty_string = constrained_string_t(range_t(1, nil))
|
1263
|
+
hsh = hash_t(non_empty_string, Integer, range_t(2,2))
|
1265
1264
|
expect(calculator.assignable?(struct1, hsh)).to eq(true)
|
1266
1265
|
expect(calculator.assignable?(hsh, struct1)).to eq(true)
|
1267
1266
|
end
|
1268
1267
|
|
1269
1268
|
it 'should accept empty hash with key_type undef' do
|
1270
1269
|
struct1 = struct_t({'a'=>optional_t(Integer)})
|
1271
|
-
hsh = hash_t(undef_t, undef_t)
|
1272
|
-
factory.constrain_size(hsh, 0, 0)
|
1270
|
+
hsh = hash_t(undef_t, undef_t, range_t(0, 0))
|
1273
1271
|
expect(calculator.assignable?(struct1, hsh)).to eq(true)
|
1274
1272
|
end
|
1275
1273
|
end
|
@@ -1294,38 +1292,38 @@ describe 'The type calculator' do
|
|
1294
1292
|
expect(calculator.assignable?(Bar, fooType)).to eq(false)
|
1295
1293
|
end
|
1296
1294
|
|
1297
|
-
it
|
1295
|
+
it 'should allow host class with same name' do
|
1298
1296
|
hc1 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
|
1299
1297
|
hc2 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
|
1300
1298
|
expect(calculator.assignable?(hc1, hc2)).to eq(true)
|
1301
1299
|
end
|
1302
1300
|
|
1303
|
-
it
|
1304
|
-
hc1 = Puppet::Pops::Types::TypeFactory.host_class
|
1301
|
+
it 'should allow host class with name assigned to hostclass without name' do
|
1302
|
+
hc1 = Puppet::Pops::Types::TypeFactory.host_class
|
1305
1303
|
hc2 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
|
1306
1304
|
expect(calculator.assignable?(hc1, hc2)).to eq(true)
|
1307
1305
|
end
|
1308
1306
|
|
1309
|
-
it
|
1307
|
+
it 'should reject host classes with different names' do
|
1310
1308
|
hc1 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
|
1311
1309
|
hc2 = Puppet::Pops::Types::TypeFactory.host_class('another_name')
|
1312
1310
|
expect(calculator.assignable?(hc1, hc2)).to eq(false)
|
1313
1311
|
end
|
1314
1312
|
|
1315
|
-
it
|
1313
|
+
it 'should reject host classes without name assigned to host class with name' do
|
1316
1314
|
hc1 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
|
1317
|
-
hc2 = Puppet::Pops::Types::TypeFactory.host_class
|
1315
|
+
hc2 = Puppet::Pops::Types::TypeFactory.host_class
|
1318
1316
|
expect(calculator.assignable?(hc1, hc2)).to eq(false)
|
1319
1317
|
end
|
1320
1318
|
|
1321
|
-
it
|
1319
|
+
it 'should allow resource with same type_name and title' do
|
1322
1320
|
r1 = Puppet::Pops::Types::TypeFactory.resource('file', 'foo')
|
1323
1321
|
r2 = Puppet::Pops::Types::TypeFactory.resource('file', 'foo')
|
1324
1322
|
expect(calculator.assignable?(r1, r2)).to eq(true)
|
1325
1323
|
end
|
1326
1324
|
|
1327
|
-
it
|
1328
|
-
r1 = Puppet::Pops::Types::TypeFactory.resource
|
1325
|
+
it 'should allow more specific resource assignment' do
|
1326
|
+
r1 = Puppet::Pops::Types::TypeFactory.resource
|
1329
1327
|
r2 = Puppet::Pops::Types::TypeFactory.resource('file')
|
1330
1328
|
expect(calculator.assignable?(r1, r2)).to eq(true)
|
1331
1329
|
r2 = Puppet::Pops::Types::TypeFactory.resource('file', '/tmp/foo')
|
@@ -1334,37 +1332,37 @@ describe 'The type calculator' do
|
|
1334
1332
|
expect(calculator.assignable?(r1, r2)).to eq(true)
|
1335
1333
|
end
|
1336
1334
|
|
1337
|
-
it
|
1335
|
+
it 'should reject less specific resource assignment' do
|
1338
1336
|
r1 = Puppet::Pops::Types::TypeFactory.resource('file', '/tmp/foo')
|
1339
1337
|
r2 = Puppet::Pops::Types::TypeFactory.resource('file')
|
1340
1338
|
expect(calculator.assignable?(r1, r2)).to eq(false)
|
1341
|
-
r2 = Puppet::Pops::Types::TypeFactory.resource
|
1339
|
+
r2 = Puppet::Pops::Types::TypeFactory.resource
|
1342
1340
|
expect(calculator.assignable?(r1, r2)).to eq(false)
|
1343
1341
|
end
|
1344
1342
|
|
1345
1343
|
end
|
1346
1344
|
|
1347
1345
|
context 'when testing if x is instance of type t' do
|
1348
|
-
include_context
|
1346
|
+
include_context 'types_setup'
|
1349
1347
|
|
1350
1348
|
it 'should consider undef to be instance of Any, NilType, and optional' do
|
1351
|
-
expect(calculator.instance?(Puppet::Pops::Types::PUndefType
|
1352
|
-
expect(calculator.instance?(Puppet::Pops::Types::PAnyType
|
1353
|
-
expect(calculator.instance?(Puppet::Pops::Types::POptionalType
|
1349
|
+
expect(calculator.instance?(Puppet::Pops::Types::PUndefType::DEFAULT, nil)).to eq(true)
|
1350
|
+
expect(calculator.instance?(Puppet::Pops::Types::PAnyType::DEFAULT, nil)).to eq(true)
|
1351
|
+
expect(calculator.instance?(Puppet::Pops::Types::POptionalType::DEFAULT, nil)).to eq(true)
|
1354
1352
|
end
|
1355
1353
|
|
1356
1354
|
it 'all types should be (ruby) instance of PAnyType' do
|
1357
1355
|
all_types.each do |t|
|
1358
|
-
expect(t.
|
1356
|
+
expect(t::DEFAULT.is_a?(Puppet::Pops::Types::PAnyType)).to eq(true)
|
1359
1357
|
end
|
1360
1358
|
end
|
1361
1359
|
|
1362
1360
|
it "should consider :undef to be instance of Runtime['ruby', 'Symbol]" do
|
1363
|
-
expect(calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:
|
1361
|
+
expect(calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:ruby, 'Symbol'), :undef)).to eq(true)
|
1364
1362
|
end
|
1365
1363
|
|
1366
|
-
it
|
1367
|
-
expect(calculator.instance?(Puppet::Pops::Types::POptionalType
|
1364
|
+
it 'should consider :undef to be instance of an Optional type' do
|
1365
|
+
expect(calculator.instance?(Puppet::Pops::Types::POptionalType::DEFAULT, :undef)).to eq(true)
|
1368
1366
|
end
|
1369
1367
|
|
1370
1368
|
it 'should not consider undef to be an instance of any other type than Any, UndefType and Data' do
|
@@ -1375,13 +1373,13 @@ describe 'The type calculator' do
|
|
1375
1373
|
Puppet::Pops::Types::POptionalType,
|
1376
1374
|
]
|
1377
1375
|
|
1378
|
-
types_to_test.each {|t| expect(calculator.instance?(t
|
1379
|
-
types_to_test.each {|t| expect(calculator.instance?(t
|
1376
|
+
types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, nil)).to eq(false) }
|
1377
|
+
types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, :undef)).to eq(false) }
|
1380
1378
|
end
|
1381
1379
|
|
1382
1380
|
it 'should consider default to be instance of Default and Any' do
|
1383
|
-
expect(calculator.instance?(Puppet::Pops::Types::PDefaultType
|
1384
|
-
expect(calculator.instance?(Puppet::Pops::Types::PAnyType
|
1381
|
+
expect(calculator.instance?(Puppet::Pops::Types::PDefaultType::DEFAULT, :default)).to eq(true)
|
1382
|
+
expect(calculator.instance?(Puppet::Pops::Types::PAnyType::DEFAULT, :default)).to eq(true)
|
1385
1383
|
end
|
1386
1384
|
|
1387
1385
|
it 'should not consider "default" to be an instance of anything but Default, NotUndef, and Any' do
|
@@ -1391,11 +1389,11 @@ describe 'The type calculator' do
|
|
1391
1389
|
Puppet::Pops::Types::PDefaultType,
|
1392
1390
|
]
|
1393
1391
|
|
1394
|
-
types_to_test.each {|t| expect(calculator.instance?(t
|
1392
|
+
types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, :default)).to eq(false) }
|
1395
1393
|
end
|
1396
1394
|
|
1397
1395
|
it 'should consider fixnum instanceof PIntegerType' do
|
1398
|
-
expect(calculator.instance?(Puppet::Pops::Types::PIntegerType
|
1396
|
+
expect(calculator.instance?(Puppet::Pops::Types::PIntegerType::DEFAULT, 1)).to eq(true)
|
1399
1397
|
end
|
1400
1398
|
|
1401
1399
|
it 'should consider fixnum instanceof Fixnum' do
|
@@ -1411,7 +1409,7 @@ describe 'The type calculator' do
|
|
1411
1409
|
end
|
1412
1410
|
|
1413
1411
|
it 'should consider string in length range' do
|
1414
|
-
range =
|
1412
|
+
range = constrained_string_t(range_t(1,3))
|
1415
1413
|
expect(calculator.instance?(range, 'a')).to eq(true)
|
1416
1414
|
expect(calculator.instance?(range, 'abc')).to eq(true)
|
1417
1415
|
expect(calculator.instance?(range, '')).to eq(false)
|
@@ -1426,7 +1424,7 @@ describe 'The type calculator' do
|
|
1426
1424
|
end
|
1427
1425
|
|
1428
1426
|
it 'should consider array in length range' do
|
1429
|
-
range =
|
1427
|
+
range = array_t(integer_t, range_t(1,3))
|
1430
1428
|
expect(calculator.instance?(range, [1])).to eq(true)
|
1431
1429
|
expect(calculator.instance?(range, [1,2,3])).to eq(true)
|
1432
1430
|
expect(calculator.instance?(range, [])).to eq(false)
|
@@ -1434,7 +1432,7 @@ describe 'The type calculator' do
|
|
1434
1432
|
end
|
1435
1433
|
|
1436
1434
|
it 'should consider hash in length range' do
|
1437
|
-
range =
|
1435
|
+
range = hash_t(integer_t, integer_t, range_t(1,2))
|
1438
1436
|
expect(calculator.instance?(range, {1=>1})).to eq(true)
|
1439
1437
|
expect(calculator.instance?(range, {1=>1, 2=>2})).to eq(true)
|
1440
1438
|
expect(calculator.instance?(range, {})).to eq(false)
|
@@ -1442,7 +1440,7 @@ describe 'The type calculator' do
|
|
1442
1440
|
end
|
1443
1441
|
|
1444
1442
|
it 'should consider collection in length range for array ' do
|
1445
|
-
range =
|
1443
|
+
range = collection_t(range_t(1,3))
|
1446
1444
|
expect(calculator.instance?(range, [1])).to eq(true)
|
1447
1445
|
expect(calculator.instance?(range, [1,2,3])).to eq(true)
|
1448
1446
|
expect(calculator.instance?(range, [])).to eq(false)
|
@@ -1450,7 +1448,7 @@ describe 'The type calculator' do
|
|
1450
1448
|
end
|
1451
1449
|
|
1452
1450
|
it 'should consider collection in length range for hash' do
|
1453
|
-
range =
|
1451
|
+
range = collection_t(range_t(1,2))
|
1454
1452
|
expect(calculator.instance?(range, {1=>1})).to eq(true)
|
1455
1453
|
expect(calculator.instance?(range, {1=>1, 2=>2})).to eq(true)
|
1456
1454
|
expect(calculator.instance?(range, {})).to eq(false)
|
@@ -1581,7 +1579,7 @@ describe 'The type calculator' do
|
|
1581
1579
|
end
|
1582
1580
|
end
|
1583
1581
|
|
1584
|
-
context
|
1582
|
+
context 'and t is something Callable' do
|
1585
1583
|
|
1586
1584
|
it 'a Closure should be considered a Callable' do
|
1587
1585
|
factory = Puppet::Pops::Model::Factory
|
@@ -1657,66 +1655,57 @@ describe 'The type calculator' do
|
|
1657
1655
|
|
1658
1656
|
context 'when representing the type as string' do
|
1659
1657
|
it 'should yield \'Type\' for PType' do
|
1660
|
-
expect(calculator.string(Puppet::Pops::Types::PType
|
1658
|
+
expect(calculator.string(Puppet::Pops::Types::PType::DEFAULT)).to eq('Type')
|
1661
1659
|
end
|
1662
1660
|
|
1663
1661
|
it 'should yield \'Object\' for PAnyType' do
|
1664
|
-
expect(calculator.string(Puppet::Pops::Types::PAnyType
|
1662
|
+
expect(calculator.string(Puppet::Pops::Types::PAnyType::DEFAULT)).to eq('Any')
|
1665
1663
|
end
|
1666
1664
|
|
1667
1665
|
it 'should yield \'Scalar\' for PScalarType' do
|
1668
|
-
expect(calculator.string(Puppet::Pops::Types::PScalarType
|
1666
|
+
expect(calculator.string(Puppet::Pops::Types::PScalarType::DEFAULT)).to eq('Scalar')
|
1669
1667
|
end
|
1670
1668
|
|
1671
1669
|
it 'should yield \'Boolean\' for PBooleanType' do
|
1672
|
-
expect(calculator.string(Puppet::Pops::Types::PBooleanType
|
1670
|
+
expect(calculator.string(Puppet::Pops::Types::PBooleanType::DEFAULT)).to eq('Boolean')
|
1673
1671
|
end
|
1674
1672
|
|
1675
1673
|
it 'should yield \'Data\' for PDataType' do
|
1676
|
-
expect(calculator.string(Puppet::Pops::Types::PDataType
|
1674
|
+
expect(calculator.string(Puppet::Pops::Types::PDataType::DEFAULT)).to eq('Data')
|
1677
1675
|
end
|
1678
1676
|
|
1679
1677
|
it 'should yield \'Numeric\' for PNumericType' do
|
1680
|
-
expect(calculator.string(Puppet::Pops::Types::PNumericType
|
1678
|
+
expect(calculator.string(Puppet::Pops::Types::PNumericType::DEFAULT)).to eq('Numeric')
|
1681
1679
|
end
|
1682
1680
|
|
1683
1681
|
it 'should yield \'Integer\' and from/to for PIntegerType' do
|
1684
1682
|
int_T = Puppet::Pops::Types::PIntegerType
|
1685
|
-
expect(calculator.string(int_T
|
1686
|
-
int = int_T.new()
|
1687
|
-
int.from = 1
|
1688
|
-
int.to = 1
|
1683
|
+
expect(calculator.string(int_T::DEFAULT)).to eq('Integer')
|
1684
|
+
int = int_T.new(1, 1)
|
1689
1685
|
expect(calculator.string(int)).to eq('Integer[1, 1]')
|
1690
|
-
int = int_T.new()
|
1691
|
-
int.from = 1
|
1692
|
-
int.to = 2
|
1686
|
+
int = int_T.new(1, 2)
|
1693
1687
|
expect(calculator.string(int)).to eq('Integer[1, 2]')
|
1694
|
-
int = int_T.new()
|
1695
|
-
int.from = nil
|
1696
|
-
int.to = 2
|
1688
|
+
int = int_T.new(nil, 2)
|
1697
1689
|
expect(calculator.string(int)).to eq('Integer[default, 2]')
|
1698
|
-
int = int_T.new()
|
1699
|
-
int.from = 2
|
1700
|
-
int.to = nil
|
1690
|
+
int = int_T.new(2, nil)
|
1701
1691
|
expect(calculator.string(int)).to eq('Integer[2, default]')
|
1702
1692
|
end
|
1703
1693
|
|
1704
1694
|
it 'should yield \'Float\' for PFloatType' do
|
1705
|
-
expect(calculator.string(Puppet::Pops::Types::PFloatType
|
1695
|
+
expect(calculator.string(Puppet::Pops::Types::PFloatType::DEFAULT)).to eq('Float')
|
1706
1696
|
end
|
1707
1697
|
|
1708
1698
|
it 'should yield \'Regexp\' for PRegexpType' do
|
1709
|
-
expect(calculator.string(Puppet::Pops::Types::PRegexpType
|
1699
|
+
expect(calculator.string(Puppet::Pops::Types::PRegexpType::DEFAULT)).to eq('Regexp')
|
1710
1700
|
end
|
1711
1701
|
|
1712
1702
|
it 'should yield \'Regexp[/pat/]\' for parameterized PRegexpType' do
|
1713
|
-
t = Puppet::Pops::Types::PRegexpType.new()
|
1714
|
-
t.
|
1715
|
-
expect(calculator.string(Puppet::Pops::Types::PRegexpType.new())).to eq('Regexp')
|
1703
|
+
t = Puppet::Pops::Types::PRegexpType.new('a/b')
|
1704
|
+
expect(calculator.string(t)).to eq('Regexp[/a\/b/]')
|
1716
1705
|
end
|
1717
1706
|
|
1718
1707
|
it 'should yield \'String\' for PStringType' do
|
1719
|
-
expect(calculator.string(Puppet::Pops::Types::PStringType
|
1708
|
+
expect(calculator.string(Puppet::Pops::Types::PStringType::DEFAULT)).to eq('String')
|
1720
1709
|
end
|
1721
1710
|
|
1722
1711
|
it 'should yield \'String\' for PStringType with multiple values' do
|
@@ -1725,104 +1714,94 @@ describe 'The type calculator' do
|
|
1725
1714
|
|
1726
1715
|
it 'should yield \'String\' and from/to for PStringType' do
|
1727
1716
|
string_T = Puppet::Pops::Types::PStringType
|
1728
|
-
expect(calculator.string(
|
1729
|
-
expect(calculator.string(
|
1730
|
-
expect(calculator.string(
|
1731
|
-
expect(calculator.string(
|
1717
|
+
expect(calculator.string(string_T.new(range_t(1,1)))).to eq('String[1, 1]')
|
1718
|
+
expect(calculator.string(string_T.new(range_t(1,2)))).to eq('String[1, 2]')
|
1719
|
+
expect(calculator.string(string_T.new(range_t(:default, 2)))).to eq('String[default, 2]')
|
1720
|
+
expect(calculator.string(string_T.new(range_t(2, :default)))).to eq('String[2, default]')
|
1732
1721
|
end
|
1733
1722
|
|
1734
1723
|
it 'should yield \'Array[Integer]\' for PArrayType[PIntegerType]' do
|
1735
|
-
t = Puppet::Pops::Types::PArrayType.new()
|
1736
|
-
t.element_type = Puppet::Pops::Types::PIntegerType.new()
|
1724
|
+
t = Puppet::Pops::Types::PArrayType.new(Puppet::Pops::Types::PIntegerType::DEFAULT)
|
1737
1725
|
expect(calculator.string(t)).to eq('Array[Integer]')
|
1738
1726
|
end
|
1739
1727
|
|
1728
|
+
it 'should yield \'Array[Unit, 0, 0]\' for an empty array' do
|
1729
|
+
t = empty_array_t
|
1730
|
+
expect(calculator.string(t)).to eq('Array[Unit, 0, 0]')
|
1731
|
+
end
|
1732
|
+
|
1740
1733
|
it 'should yield \'Collection\' and from/to for PCollectionType' do
|
1741
|
-
|
1742
|
-
expect(calculator.string(
|
1743
|
-
expect(calculator.string(
|
1744
|
-
expect(calculator.string(
|
1745
|
-
expect(calculator.string(factory.constrain_size(col.copy, 2, :default))).to eq('Collection[2, default]')
|
1734
|
+
expect(calculator.string(collection_t(range_t(1,1)))).to eq('Collection[1, 1]')
|
1735
|
+
expect(calculator.string(collection_t(range_t(1,2)))).to eq('Collection[1, 2]')
|
1736
|
+
expect(calculator.string(collection_t(range_t(:default, 2)))).to eq('Collection[default, 2]')
|
1737
|
+
expect(calculator.string(collection_t(range_t(2, :default)))).to eq('Collection[2, default]')
|
1746
1738
|
end
|
1747
1739
|
|
1748
1740
|
it 'should yield \'Array\' and from/to for PArrayType' do
|
1749
|
-
|
1750
|
-
expect(calculator.string(
|
1751
|
-
expect(calculator.string(
|
1752
|
-
expect(calculator.string(
|
1753
|
-
expect(calculator.string(factory.constrain_size(arr.copy, 2, :default))).to eq('Array[String, 2, default]')
|
1741
|
+
expect(calculator.string(array_t(string_t, range_t(1,1)))).to eq('Array[String, 1, 1]')
|
1742
|
+
expect(calculator.string(array_t(string_t, range_t(1,2)))).to eq('Array[String, 1, 2]')
|
1743
|
+
expect(calculator.string(array_t(string_t, range_t(:default, 2)))).to eq('Array[String, default, 2]')
|
1744
|
+
expect(calculator.string(array_t(string_t, range_t(2, :default)))).to eq('Array[String, 2, default]')
|
1754
1745
|
end
|
1755
1746
|
|
1756
1747
|
it 'should yield \'Tuple[Integer]\' for PTupleType[PIntegerType]' do
|
1757
|
-
t = Puppet::Pops::Types::PTupleType.new()
|
1758
|
-
t.addTypes(Puppet::Pops::Types::PIntegerType.new())
|
1748
|
+
t = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PIntegerType::DEFAULT])
|
1759
1749
|
expect(calculator.string(t)).to eq('Tuple[Integer]')
|
1760
1750
|
end
|
1761
1751
|
|
1762
1752
|
it 'should yield \'Tuple[T, T,..]\' for PTupleType[T, T, ...]' do
|
1763
|
-
t = Puppet::Pops::Types::PTupleType.new()
|
1764
|
-
t.addTypes(Puppet::Pops::Types::PIntegerType.new())
|
1765
|
-
t.addTypes(Puppet::Pops::Types::PIntegerType.new())
|
1766
|
-
t.addTypes(Puppet::Pops::Types::PStringType.new())
|
1753
|
+
t = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PIntegerType::DEFAULT, Puppet::Pops::Types::PIntegerType::DEFAULT, Puppet::Pops::Types::PStringType::DEFAULT])
|
1767
1754
|
expect(calculator.string(t)).to eq('Tuple[Integer, Integer, String]')
|
1768
1755
|
end
|
1769
1756
|
|
1770
1757
|
it 'should yield \'Tuple\' and from/to for PTupleType' do
|
1771
|
-
|
1772
|
-
expect(calculator.string(
|
1773
|
-
expect(calculator.string(
|
1774
|
-
expect(calculator.string(
|
1775
|
-
expect(calculator.string(factory.constrain_size(tuple_t.copy, 2, :default))).to eq('Tuple[String, 2, default]')
|
1758
|
+
expect(calculator.string(constrained_tuple_t(range_t(1,1), string_t))).to eq('Tuple[String, 1, 1]')
|
1759
|
+
expect(calculator.string(constrained_tuple_t(range_t(1,2), string_t))).to eq('Tuple[String, 1, 2]')
|
1760
|
+
expect(calculator.string(constrained_tuple_t(range_t(:default, 2), string_t))).to eq('Tuple[String, 0, 2]')
|
1761
|
+
expect(calculator.string(constrained_tuple_t(range_t(2, :default), string_t))).to eq('Tuple[String, 2, default]')
|
1776
1762
|
end
|
1777
1763
|
|
1778
1764
|
it 'should yield \'Struct\' and details for PStructType' do
|
1779
1765
|
struct_t = struct_t({'a'=>Integer, 'b'=>String})
|
1780
1766
|
expect(calculator.string(struct_t)).to eq("Struct[{'a'=>Integer, 'b'=>String}]")
|
1781
1767
|
struct_t = struct_t({})
|
1782
|
-
expect(calculator.string(struct_t)).to eq(
|
1768
|
+
expect(calculator.string(struct_t)).to eq('Struct')
|
1783
1769
|
end
|
1784
1770
|
|
1785
1771
|
it 'should yield \'Hash[String, Integer]\' for PHashType[PStringType, PIntegerType]' do
|
1786
|
-
t = Puppet::Pops::Types::PHashType.new()
|
1787
|
-
t.key_type = Puppet::Pops::Types::PStringType.new()
|
1788
|
-
t.element_type = Puppet::Pops::Types::PIntegerType.new()
|
1772
|
+
t = Puppet::Pops::Types::PHashType.new(Puppet::Pops::Types::PStringType::DEFAULT, Puppet::Pops::Types::PIntegerType::DEFAULT)
|
1789
1773
|
expect(calculator.string(t)).to eq('Hash[String, Integer]')
|
1790
1774
|
end
|
1791
1775
|
|
1792
1776
|
it 'should yield \'Hash\' and from/to for PHashType' do
|
1793
|
-
|
1794
|
-
expect(calculator.string(
|
1795
|
-
expect(calculator.string(
|
1796
|
-
expect(calculator.string(
|
1797
|
-
expect(calculator.string(factory.constrain_size(hsh.copy, 2, :default))).to eq('Hash[String, String, 2, default]')
|
1777
|
+
expect(calculator.string(hash_t(string_t, string_t, range_t(1,1)))).to eq('Hash[String, String, 1, 1]')
|
1778
|
+
expect(calculator.string(hash_t(string_t, string_t, range_t(1,2)))).to eq('Hash[String, String, 1, 2]')
|
1779
|
+
expect(calculator.string(hash_t(string_t, string_t, range_t(:default, 2)))).to eq('Hash[String, String, default, 2]')
|
1780
|
+
expect(calculator.string(hash_t(string_t, string_t, range_t(2, :default)))).to eq('Hash[String, String, 2, default]')
|
1798
1781
|
end
|
1799
1782
|
|
1800
1783
|
it "should yield 'Class' for a PHostClassType" do
|
1801
|
-
t = Puppet::Pops::Types::PHostClassType
|
1784
|
+
t = Puppet::Pops::Types::PHostClassType::DEFAULT
|
1802
1785
|
expect(calculator.string(t)).to eq('Class')
|
1803
1786
|
end
|
1804
1787
|
|
1805
1788
|
it "should yield 'Class[x]' for a PHostClassType[x]" do
|
1806
|
-
t = Puppet::Pops::Types::PHostClassType.new()
|
1807
|
-
t.class_name = 'x'
|
1789
|
+
t = Puppet::Pops::Types::PHostClassType.new('x')
|
1808
1790
|
expect(calculator.string(t)).to eq('Class[x]')
|
1809
1791
|
end
|
1810
1792
|
|
1811
1793
|
it "should yield 'Resource' for a PResourceType" do
|
1812
|
-
t = Puppet::Pops::Types::PResourceType
|
1794
|
+
t = Puppet::Pops::Types::PResourceType::DEFAULT
|
1813
1795
|
expect(calculator.string(t)).to eq('Resource')
|
1814
1796
|
end
|
1815
1797
|
|
1816
1798
|
it 'should yield \'File\' for a PResourceType[\'File\']' do
|
1817
|
-
t = Puppet::Pops::Types::PResourceType.new()
|
1818
|
-
t.type_name = 'File'
|
1799
|
+
t = Puppet::Pops::Types::PResourceType.new('File')
|
1819
1800
|
expect(calculator.string(t)).to eq('File')
|
1820
1801
|
end
|
1821
1802
|
|
1822
1803
|
it "should yield 'File['/tmp/foo']' for a PResourceType['File', '/tmp/foo']" do
|
1823
|
-
t = Puppet::Pops::Types::PResourceType.new()
|
1824
|
-
t.type_name = 'File'
|
1825
|
-
t.title = '/tmp/foo'
|
1804
|
+
t = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
|
1826
1805
|
expect(calculator.string(t)).to eq("File['/tmp/foo']")
|
1827
1806
|
end
|
1828
1807
|
|
@@ -1834,8 +1813,8 @@ describe 'The type calculator' do
|
|
1834
1813
|
it "should yield 'Pattern[/pat/,...]' for a PPatternType['pat',...]" do
|
1835
1814
|
t = pattern_t('a')
|
1836
1815
|
t2 = pattern_t('a', 'b', 'c')
|
1837
|
-
expect(calculator.string(t)).to eq(
|
1838
|
-
expect(calculator.string(t2)).to eq(
|
1816
|
+
expect(calculator.string(t)).to eq('Pattern[/a/]')
|
1817
|
+
expect(calculator.string(t2)).to eq('Pattern[/a/, /b/, /c/]')
|
1839
1818
|
end
|
1840
1819
|
|
1841
1820
|
it "should escape special characters in the string for a PPatternType['pat',...]" do
|
@@ -1844,46 +1823,46 @@ describe 'The type calculator' do
|
|
1844
1823
|
end
|
1845
1824
|
|
1846
1825
|
it "should yield 'Variant[t1,t2,...]' for a PVariantType[t1, t2,...]" do
|
1847
|
-
t1 = string_t
|
1848
|
-
t2 = integer_t
|
1826
|
+
t1 = string_t
|
1827
|
+
t2 = integer_t
|
1849
1828
|
t3 = pattern_t('a')
|
1850
1829
|
t = variant_t(t1, t2, t3)
|
1851
|
-
expect(calculator.string(t)).to eq(
|
1830
|
+
expect(calculator.string(t)).to eq('Variant[String, Integer, Pattern[/a/]]')
|
1852
1831
|
end
|
1853
1832
|
|
1854
1833
|
it "should yield 'Callable' for generic callable" do
|
1855
|
-
expect(calculator.string(all_callables_t)).to eql(
|
1834
|
+
expect(calculator.string(all_callables_t)).to eql('Callable')
|
1856
1835
|
end
|
1857
1836
|
|
1858
1837
|
it "should yield 'Callable[0,0]' for callable without params" do
|
1859
|
-
expect(calculator.string(callable_t)).to eql(
|
1838
|
+
expect(calculator.string(callable_t)).to eql('Callable[0, 0]')
|
1860
1839
|
end
|
1861
1840
|
|
1862
1841
|
it "should yield 'Callable[t,t]' for callable with typed parameters" do
|
1863
|
-
expect(calculator.string(callable_t(String, Integer))).to eql(
|
1842
|
+
expect(calculator.string(callable_t(String, Integer))).to eql('Callable[String, Integer]')
|
1864
1843
|
end
|
1865
1844
|
|
1866
1845
|
it "should yield 'Callable[t,min,max]' for callable with size constraint (infinite max)" do
|
1867
|
-
expect(calculator.string(callable_t(String, 0))).to eql(
|
1846
|
+
expect(calculator.string(callable_t(String, 0))).to eql('Callable[String, 0, default]')
|
1868
1847
|
end
|
1869
1848
|
|
1870
1849
|
it "should yield 'Callable[t,min,max]' for callable with size constraint (capped max)" do
|
1871
|
-
expect(calculator.string(callable_t(String, 0, 3))).to eql(
|
1850
|
+
expect(calculator.string(callable_t(String, 0, 3))).to eql('Callable[String, 0, 3]')
|
1872
1851
|
end
|
1873
1852
|
|
1874
1853
|
it "should yield 'Callable[min,max]' callable with size > 0" do
|
1875
|
-
expect(calculator.string(callable_t(0, 0))).to eql(
|
1876
|
-
expect(calculator.string(callable_t(0, 1))).to eql(
|
1877
|
-
expect(calculator.string(callable_t(0, :default))).to eql(
|
1854
|
+
expect(calculator.string(callable_t(0, 0))).to eql('Callable[0, 0]')
|
1855
|
+
expect(calculator.string(callable_t(0, 1))).to eql('Callable[0, 1]')
|
1856
|
+
expect(calculator.string(callable_t(0, :default))).to eql('Callable[0, default]')
|
1878
1857
|
end
|
1879
1858
|
|
1880
1859
|
it "should yield 'Callable[Callable]' for callable with block" do
|
1881
|
-
expect(calculator.string(callable_t(all_callables_t))).to eql(
|
1882
|
-
expect(calculator.string(callable_t(string_t, all_callables_t))).to eql(
|
1883
|
-
expect(calculator.string(callable_t(string_t, 1,1, all_callables_t))).to eql(
|
1860
|
+
expect(calculator.string(callable_t(all_callables_t))).to eql('Callable[0, 0, Callable]')
|
1861
|
+
expect(calculator.string(callable_t(string_t, all_callables_t))).to eql('Callable[String, Callable]')
|
1862
|
+
expect(calculator.string(callable_t(string_t, 1,1, all_callables_t))).to eql('Callable[String, 1, 1, Callable]')
|
1884
1863
|
end
|
1885
1864
|
|
1886
|
-
it
|
1865
|
+
it 'should yield Unit for a Unit type' do
|
1887
1866
|
expect(calculator.string(unit_t)).to eql('Unit')
|
1888
1867
|
end
|
1889
1868
|
|
@@ -1906,63 +1885,62 @@ describe 'The type calculator' do
|
|
1906
1885
|
context 'when processing meta type' do
|
1907
1886
|
it 'should infer PType as the type of all other types' do
|
1908
1887
|
ptype = Puppet::Pops::Types::PType
|
1909
|
-
expect(calculator.infer(Puppet::Pops::Types::PUndefType
|
1910
|
-
expect(calculator.infer(Puppet::Pops::Types::PDataType
|
1911
|
-
expect(calculator.infer(Puppet::Pops::Types::PScalarType
|
1912
|
-
expect(calculator.infer(Puppet::Pops::Types::PStringType
|
1913
|
-
expect(calculator.infer(Puppet::Pops::Types::PNumericType
|
1914
|
-
expect(calculator.infer(Puppet::Pops::Types::PIntegerType
|
1915
|
-
expect(calculator.infer(Puppet::Pops::Types::PFloatType
|
1916
|
-
expect(calculator.infer(Puppet::Pops::Types::PRegexpType
|
1917
|
-
expect(calculator.infer(Puppet::Pops::Types::PBooleanType
|
1918
|
-
expect(calculator.infer(Puppet::Pops::Types::PCollectionType
|
1919
|
-
expect(calculator.infer(Puppet::Pops::Types::PArrayType
|
1920
|
-
expect(calculator.infer(Puppet::Pops::Types::PHashType
|
1921
|
-
expect(calculator.infer(Puppet::Pops::Types::PRuntimeType
|
1922
|
-
expect(calculator.infer(Puppet::Pops::Types::PHostClassType
|
1923
|
-
expect(calculator.infer(Puppet::Pops::Types::PResourceType
|
1924
|
-
expect(calculator.infer(Puppet::Pops::Types::PEnumType
|
1925
|
-
expect(calculator.infer(Puppet::Pops::Types::PPatternType
|
1926
|
-
expect(calculator.infer(Puppet::Pops::Types::PVariantType
|
1927
|
-
expect(calculator.infer(Puppet::Pops::Types::PTupleType
|
1928
|
-
expect(calculator.infer(Puppet::Pops::Types::POptionalType
|
1929
|
-
expect(calculator.infer(Puppet::Pops::Types::PCallableType
|
1888
|
+
expect(calculator.infer(Puppet::Pops::Types::PUndefType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1889
|
+
expect(calculator.infer(Puppet::Pops::Types::PDataType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1890
|
+
expect(calculator.infer(Puppet::Pops::Types::PScalarType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1891
|
+
expect(calculator.infer(Puppet::Pops::Types::PStringType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1892
|
+
expect(calculator.infer(Puppet::Pops::Types::PNumericType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1893
|
+
expect(calculator.infer(Puppet::Pops::Types::PIntegerType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1894
|
+
expect(calculator.infer(Puppet::Pops::Types::PFloatType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1895
|
+
expect(calculator.infer(Puppet::Pops::Types::PRegexpType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1896
|
+
expect(calculator.infer(Puppet::Pops::Types::PBooleanType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1897
|
+
expect(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT).is_a?(ptype)).to eq(true)
|
1898
|
+
expect(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1899
|
+
expect(calculator.infer(Puppet::Pops::Types::PHashType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1900
|
+
expect(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1901
|
+
expect(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1902
|
+
expect(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1903
|
+
expect(calculator.infer(Puppet::Pops::Types::PEnumType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1904
|
+
expect(calculator.infer(Puppet::Pops::Types::PPatternType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1905
|
+
expect(calculator.infer(Puppet::Pops::Types::PVariantType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1906
|
+
expect(calculator.infer(Puppet::Pops::Types::PTupleType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1907
|
+
expect(calculator.infer(Puppet::Pops::Types::POptionalType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1908
|
+
expect(calculator.infer(Puppet::Pops::Types::PCallableType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1930
1909
|
end
|
1931
1910
|
|
1932
1911
|
it 'should infer PType as the type of all other types' do
|
1933
|
-
|
1934
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1935
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1936
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1937
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1938
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1939
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1940
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1941
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1942
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1943
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1944
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1945
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1946
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1947
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1948
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1949
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1950
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1951
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1952
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1953
|
-
expect(calculator.string(calculator.infer(Puppet::Pops::Types::
|
1954
|
-
|
1955
|
-
|
1956
|
-
expect(calculator.infer(Puppet::Pops::Types::PResourceType.new(
|
1957
|
-
expect(calculator.
|
1958
|
-
expect(calculator.infer(Puppet::Pops::Types::PResourceType.new(:type_name => 'Foo::Fee::Fum')).to_s).to eq("Type[Foo::Fee::Fum]")
|
1912
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PUndefType::DEFAULT ))).to eq('Type[Undef]')
|
1913
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PDataType::DEFAULT ))).to eq('Type[Data]')
|
1914
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PScalarType::DEFAULT ))).to eq('Type[Scalar]')
|
1915
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PStringType::DEFAULT ))).to eq('Type[String]')
|
1916
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PNumericType::DEFAULT ))).to eq('Type[Numeric]')
|
1917
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PIntegerType::DEFAULT ))).to eq('Type[Integer]')
|
1918
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PFloatType::DEFAULT ))).to eq('Type[Float]')
|
1919
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PRegexpType::DEFAULT ))).to eq('Type[Regexp]')
|
1920
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PBooleanType::DEFAULT ))).to eq('Type[Boolean]')
|
1921
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT))).to eq('Type[Collection]')
|
1922
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ))).to eq('Type[Array[?]]')
|
1923
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PHashType::DEFAULT ))).to eq('Type[Hash[?, ?]]')
|
1924
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ))).to eq('Type[Runtime[?, ?]]')
|
1925
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ))).to eq('Type[Class]')
|
1926
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ))).to eq('Type[Resource]')
|
1927
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PEnumType::DEFAULT ))).to eq('Type[Enum]')
|
1928
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PVariantType::DEFAULT ))).to eq('Type[Variant]')
|
1929
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PPatternType::DEFAULT ))).to eq('Type[Pattern]')
|
1930
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PTupleType::DEFAULT ))).to eq('Type[Tuple]')
|
1931
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::POptionalType::DEFAULT ))).to eq('Type[Optional]')
|
1932
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PCallableType::DEFAULT ))).to eq('Type[Callable]')
|
1933
|
+
|
1934
|
+
expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
|
1935
|
+
expect(calculator.string(calculator.infer(Puppet::Pops::Types::PResourceType.new('foo::fee::fum')))).to eq('Type[Foo::Fee::Fum]')
|
1936
|
+
expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('Foo::Fee::Fum')).to_s).to eq('Type[Foo::Fee::Fum]')
|
1959
1937
|
end
|
1960
1938
|
|
1961
1939
|
it "computes the common type of PType's type parameter" do
|
1962
|
-
int_t = Puppet::Pops::Types::PIntegerType
|
1963
|
-
string_t = Puppet::Pops::Types::PStringType
|
1964
|
-
expect(calculator.string(calculator.infer([int_t]))).to eq(
|
1965
|
-
expect(calculator.string(calculator.infer([int_t, string_t]))).to eq(
|
1940
|
+
int_t = Puppet::Pops::Types::PIntegerType::DEFAULT
|
1941
|
+
string_t = Puppet::Pops::Types::PStringType::DEFAULT
|
1942
|
+
expect(calculator.string(calculator.infer([int_t]))).to eq('Array[Type[Integer], 1, 1]')
|
1943
|
+
expect(calculator.string(calculator.infer([int_t, string_t]))).to eq('Array[Type[Scalar], 2, 2]')
|
1966
1944
|
end
|
1967
1945
|
|
1968
1946
|
it 'should infer PType as the type of ruby classes' do
|
@@ -1974,19 +1952,19 @@ describe 'The type calculator' do
|
|
1974
1952
|
end
|
1975
1953
|
|
1976
1954
|
it 'should infer PType as the type of PType (meta regression short-circuit)' do
|
1977
|
-
expect(calculator.infer(Puppet::Pops::Types::PType
|
1955
|
+
expect(calculator.infer(Puppet::Pops::Types::PType::DEFAULT).is_a?(Puppet::Pops::Types::PType)).to eq(true)
|
1978
1956
|
end
|
1979
1957
|
|
1980
1958
|
it 'computes instance? to be true if parameterized and type match' do
|
1981
|
-
int_t = Puppet::Pops::Types::PIntegerType
|
1959
|
+
int_t = Puppet::Pops::Types::PIntegerType::DEFAULT
|
1982
1960
|
type_t = Puppet::Pops::Types::TypeFactory.type_type(int_t)
|
1983
1961
|
type_type_t = Puppet::Pops::Types::TypeFactory.type_type(type_t)
|
1984
1962
|
expect(calculator.instance?(type_type_t, type_t)).to eq(true)
|
1985
1963
|
end
|
1986
1964
|
|
1987
1965
|
it 'computes instance? to be false if parameterized and type do not match' do
|
1988
|
-
int_t = Puppet::Pops::Types::PIntegerType
|
1989
|
-
string_t = Puppet::Pops::Types::PStringType
|
1966
|
+
int_t = Puppet::Pops::Types::PIntegerType::DEFAULT
|
1967
|
+
string_t = Puppet::Pops::Types::PStringType::DEFAULT
|
1990
1968
|
type_t = Puppet::Pops::Types::TypeFactory.type_type(int_t)
|
1991
1969
|
type_t2 = Puppet::Pops::Types::TypeFactory.type_type(string_t)
|
1992
1970
|
type_type_t = Puppet::Pops::Types::TypeFactory.type_type(type_t)
|
@@ -1995,77 +1973,71 @@ describe 'The type calculator' do
|
|
1995
1973
|
end
|
1996
1974
|
|
1997
1975
|
it 'computes instance? to be true if unparameterized and matched against a type[?]' do
|
1998
|
-
int_t = Puppet::Pops::Types::PIntegerType
|
1976
|
+
int_t = Puppet::Pops::Types::PIntegerType::DEFAULT
|
1999
1977
|
type_t = Puppet::Pops::Types::TypeFactory.type_type(int_t)
|
2000
|
-
expect(calculator.instance?(Puppet::Pops::Types::PType
|
1978
|
+
expect(calculator.instance?(Puppet::Pops::Types::PType::DEFAULT, type_t)).to eq(true)
|
2001
1979
|
end
|
2002
1980
|
end
|
2003
1981
|
|
2004
|
-
context
|
2005
|
-
it
|
2006
|
-
t = Puppet::Pops::Types::PIntegerType.new()
|
2007
|
-
t.from = 1
|
2008
|
-
t.to = 10
|
1982
|
+
context 'when asking for an enumerable ' do
|
1983
|
+
it 'should produce an enumerable for an Integer range that is not infinite' do
|
1984
|
+
t = Puppet::Pops::Types::PIntegerType.new(1, 10)
|
2009
1985
|
expect(calculator.enumerable(t).respond_to?(:each)).to eq(true)
|
2010
1986
|
end
|
2011
1987
|
|
2012
|
-
it
|
2013
|
-
t = Puppet::Pops::Types::PIntegerType.new()
|
2014
|
-
t.from = nil
|
2015
|
-
t.to = 10
|
1988
|
+
it 'should not produce an enumerable for an Integer range that has an infinite side' do
|
1989
|
+
t = Puppet::Pops::Types::PIntegerType.new(nil, 10)
|
2016
1990
|
expect(calculator.enumerable(t)).to eq(nil)
|
2017
1991
|
|
2018
|
-
t = Puppet::Pops::Types::PIntegerType.new()
|
2019
|
-
t.from = 1
|
2020
|
-
t.to = nil
|
1992
|
+
t = Puppet::Pops::Types::PIntegerType.new(1, nil)
|
2021
1993
|
expect(calculator.enumerable(t)).to eq(nil)
|
2022
1994
|
end
|
2023
1995
|
|
2024
|
-
it
|
1996
|
+
it 'all but Integer range are not enumerable' do
|
2025
1997
|
[Object, Numeric, Float, String, Regexp, Array, Hash].each do |t|
|
2026
1998
|
expect(calculator.enumerable(calculator.type(t))).to eq(nil)
|
2027
1999
|
end
|
2028
2000
|
end
|
2029
2001
|
end
|
2030
2002
|
|
2031
|
-
context
|
2032
|
-
it
|
2003
|
+
context 'when dealing with different types of inference' do
|
2004
|
+
it 'an instance specific inference is produced by infer' do
|
2033
2005
|
expect(calculator.infer(['a','b']).element_type.values).to eq(['a', 'b'])
|
2034
2006
|
end
|
2035
2007
|
|
2036
|
-
it
|
2008
|
+
it 'a generic inference is produced using infer_generic' do
|
2037
2009
|
expect(calculator.infer_generic(['a','b']).element_type.values).to eq([])
|
2038
2010
|
end
|
2039
2011
|
|
2040
|
-
it
|
2012
|
+
it 'a generic result is created by generalize given an instance specific result for an Array' do
|
2041
2013
|
generic = calculator.infer(['a','b'])
|
2042
2014
|
expect(generic.element_type.values).to eq(['a', 'b'])
|
2043
|
-
|
2015
|
+
generic = generic.generalize
|
2044
2016
|
expect(generic.element_type.values).to eq([])
|
2045
2017
|
end
|
2046
2018
|
|
2047
|
-
it 'a generic result is created by generalize
|
2019
|
+
it 'a generic result is created by generalize given an instance specific result for a Hash' do
|
2048
2020
|
generic = calculator.infer({'a' =>1,'b' => 2})
|
2049
2021
|
expect(generic.key_type.values.sort).to eq(['a', 'b'])
|
2050
2022
|
expect(generic.element_type.from).to eq(1)
|
2051
2023
|
expect(generic.element_type.to).to eq(2)
|
2052
|
-
|
2024
|
+
generic = generic.generalize
|
2053
2025
|
expect(generic.key_type.values).to eq([])
|
2054
2026
|
expect(generic.element_type.from).to eq(nil)
|
2055
2027
|
expect(generic.element_type.to).to eq(nil)
|
2056
2028
|
end
|
2057
2029
|
|
2058
2030
|
it 'ensures that Struct key types are not generalized' do
|
2059
|
-
generic =
|
2031
|
+
generic = struct_t({'a' => object_t}).generalize
|
2060
2032
|
expect(calculator.string(generic)).to eq("Struct[{'a'=>Any}]")
|
2061
|
-
generic =
|
2033
|
+
generic = struct_t({not_undef_t('a') => object_t}).generalize
|
2062
2034
|
expect(calculator.string(generic)).to eq("Struct[{NotUndef['a']=>Any}]")
|
2063
|
-
generic =
|
2035
|
+
generic = struct_t({optional_t('a') => string_t}).generalize
|
2064
2036
|
expect(calculator.string(generic)).to eq("Struct[{Optional['a']=>String}]")
|
2065
2037
|
end
|
2066
2038
|
|
2067
2039
|
it 'ensures that Struct value types are generalized' do
|
2068
|
-
generic =
|
2040
|
+
generic = struct_t({'a' => range_t(1, 3)}).generalize
|
2069
2041
|
expect(calculator.string(generic)).to eq("Struct[{'a'=>Integer}]")
|
2070
2042
|
end
|
2071
2043
|
|
@@ -2081,7 +2053,7 @@ describe 'The type calculator' do
|
|
2081
2053
|
expect(element_types[3].class).to eq(Puppet::Pops::Types::PIntegerType)
|
2082
2054
|
end
|
2083
2055
|
|
2084
|
-
it
|
2056
|
+
it 'does not reduce by combining types when using infer_set and values are undef' do
|
2085
2057
|
element_type = calculator.infer(['a',nil]).element_type
|
2086
2058
|
expect(element_type.class).to eq(Puppet::Pops::Types::PStringType)
|
2087
2059
|
inferred_type = calculator.infer_set(['a',nil])
|
@@ -2090,6 +2062,18 @@ describe 'The type calculator' do
|
|
2090
2062
|
expect(element_types[0].class).to eq(Puppet::Pops::Types::PStringType)
|
2091
2063
|
expect(element_types[1].class).to eq(Puppet::Pops::Types::PUndefType)
|
2092
2064
|
end
|
2065
|
+
|
2066
|
+
it 'infers on an empty Array produces Array[Unit,0,0]' do
|
2067
|
+
inferred_type = calculator.infer([])
|
2068
|
+
expect(inferred_type.element_type.class).to eq(Puppet::Pops::Types::PUnitType)
|
2069
|
+
expect(inferred_type.size_range).to eq([0, 0])
|
2070
|
+
end
|
2071
|
+
|
2072
|
+
it 'infer_set on an empty Array produces Array[Unit,0,0]' do
|
2073
|
+
inferred_type = calculator.infer_set([])
|
2074
|
+
expect(inferred_type.element_type.class).to eq(Puppet::Pops::Types::PUnitType)
|
2075
|
+
expect(inferred_type.size_range).to eq([0, 0])
|
2076
|
+
end
|
2093
2077
|
end
|
2094
2078
|
|
2095
2079
|
context 'when determening callability' do
|
@@ -2114,8 +2098,7 @@ describe 'The type calculator' do
|
|
2114
2098
|
|
2115
2099
|
it 'with args array' do
|
2116
2100
|
required = callable_t(string_t)
|
2117
|
-
given = array_t(string_t)
|
2118
|
-
factory.constrain_size(given, 1, 1)
|
2101
|
+
given = array_t(string_t, range_t(1, 1))
|
2119
2102
|
expect(calculator.callable?(required, given)).to eq(true)
|
2120
2103
|
end
|
2121
2104
|
end
|