spec/handlers/constant_handler_spec.rb in yard-0.9.18 vs spec/handlers/constant_handler_spec.rb in yard-0.9.19

- old
+ new

@@ -1,112 +1,112 @@ -# frozen_string_literal: true -require File.dirname(__FILE__) + '/spec_helper' - -RSpec.describe "YARD::Handlers::Ruby::#{LEGACY_PARSER ? "Legacy::" : ""}ConstantHandler" do - before(:all) { parse_file :constant_handler_001, __FILE__ } - - it "does not parse constants inside methods" do - expect(Registry.at("A::B::SOMECONSTANT").source).to eq "SOMECONSTANT= \"hello\"" - end - - it "only parses valid constants" do - expect(Registry.at("A::B::notaconstant")).to be nil - end - - it "maintains newlines" do - expect(Registry.at("A::B::MYCONSTANT").value.delete("\r")).to eq "A +\nB +\nC +\nD" - end - - it "turns Const = Struct.new(:sym) into class Const with attr :sym" do - obj = Registry.at("MyClass") - expect(obj).to be_kind_of(CodeObjects::ClassObject) - attrs = obj.attributes[:instance] - [:a, :b, :c].each do |key| - expect(attrs).to have_key(key) - expect(attrs[key][:read]).not_to be nil - expect(attrs[key][:write]).not_to be nil - end - end - - it 'documents block for Struct.new if present' do - obj = Registry.at("MyStructWithConstant") - expect(obj).to be_kind_of(CodeObjects::ClassObject) - expect(obj.constants[0].docstring).to eq 'A constant.' - expect(obj.constants[0].name).to eq :CONSTANT - expect(obj.constants[0].value).to eq "42" - expect(obj.constants[1].docstring).to eq 'Special constant (empty symbol)' - expect(obj.constants[1].name).to eq :EMPTY - expect(obj.constants[1].value).to eq ':""' - end - - it "turns Const = Struct.new('Name', :sym) into class Const with attr :sym" do - obj = Registry.at("NotMyClass") - expect(obj).to be_kind_of(CodeObjects::ClassObject) - attrs = obj.attributes[:instance] - [:b, :c].each do |key| - expect(attrs).to have_key(key) - expect(attrs[key][:read]).not_to be nil - expect(attrs[key][:write]).not_to be nil - end - - expect(Registry.at("NotMyClass2")).to be nil - end - - it "turns Const = Struct.new into empty struct" do - obj = Registry.at("MyEmptyStruct") - expect(obj).not_to be nil - expect(obj.attributes[:instance]).to be_empty - end - - it "maintains docstrings on structs defined via constants" do - obj = Registry.at("DocstringStruct") - expect(obj).not_to be nil - expect(obj.docstring).to eq "A crazy struct." - expect(obj.attributes[:instance]).not_to be_empty - a1 = Registry.at("DocstringStruct#bar") - a2 = Registry.at("DocstringStruct#baz") - expect(a1.docstring).to eq "An attr" - expect(a1.tag(:return).types).to eq ["String"] - expect(a2.docstring).to eq "Another attr" - expect(a2.tag(:return).types).to eq ["Number"] - a3 = Registry.at("DocstringStruct#new_syntax") - expect(a3.docstring).to eq "Attribute defined with the new syntax" - expect(a3.tag(:return).types).to eq ["Symbol"] - end - - it "raises undocumentable error in 1.9 parser for Struct.new assignment to non-const" do - undoc_error "nonconst = Struct.new" - end unless LEGACY_PARSER - - %w(module class).each do |type| - it "does not allow #{type} to be redefined as constant" do - undoc_error <<-eof - #{type} Foo; end - Foo = "value" - eof - end - end unless LEGACY_PARSER - - it "allows constant to have same name as constant in parent namespace" do - YARD.parse_string <<-eof - module A - class C; end - module B; C = 1 end - end - eof - expect(log.io.string).to eq "" - expect(Registry.at('A::B::C').type).to eq :constant - end - - it "detects compound constant names" do - YARD.parse_string <<-eof - module A - class AA; end - AA::B = true - end - A::AA::C = true - eof - - expect(Registry.at('A::AA::B').type).to eq :constant - expect(Registry.at('A::AA::C').type).to eq :constant - end if HAVE_RIPPER -end +# frozen_string_literal: true +require File.dirname(__FILE__) + '/spec_helper' + +RSpec.describe "YARD::Handlers::Ruby::#{LEGACY_PARSER ? "Legacy::" : ""}ConstantHandler" do + before(:all) { parse_file :constant_handler_001, __FILE__ } + + it "does not parse constants inside methods" do + expect(Registry.at("A::B::SOMECONSTANT").source).to eq "SOMECONSTANT= \"hello\"" + end + + it "only parses valid constants" do + expect(Registry.at("A::B::notaconstant")).to be nil + end + + it "maintains newlines" do + expect(Registry.at("A::B::MYCONSTANT").value.delete("\r")).to eq "A +\nB +\nC +\nD" + end + + it "turns Const = Struct.new(:sym) into class Const with attr :sym" do + obj = Registry.at("MyClass") + expect(obj).to be_kind_of(CodeObjects::ClassObject) + attrs = obj.attributes[:instance] + [:a, :b, :c].each do |key| + expect(attrs).to have_key(key) + expect(attrs[key][:read]).not_to be nil + expect(attrs[key][:write]).not_to be nil + end + end + + it 'documents block for Struct.new if present' do + obj = Registry.at("MyStructWithConstant") + expect(obj).to be_kind_of(CodeObjects::ClassObject) + expect(obj.constants[0].docstring).to eq 'A constant.' + expect(obj.constants[0].name).to eq :CONSTANT + expect(obj.constants[0].value).to eq "42" + expect(obj.constants[1].docstring).to eq 'Special constant (empty symbol)' + expect(obj.constants[1].name).to eq :EMPTY + expect(obj.constants[1].value).to eq ':""' + end + + it "turns Const = Struct.new('Name', :sym) into class Const with attr :sym" do + obj = Registry.at("NotMyClass") + expect(obj).to be_kind_of(CodeObjects::ClassObject) + attrs = obj.attributes[:instance] + [:b, :c].each do |key| + expect(attrs).to have_key(key) + expect(attrs[key][:read]).not_to be nil + expect(attrs[key][:write]).not_to be nil + end + + expect(Registry.at("NotMyClass2")).to be nil + end + + it "turns Const = Struct.new into empty struct" do + obj = Registry.at("MyEmptyStruct") + expect(obj).not_to be nil + expect(obj.attributes[:instance]).to be_empty + end + + it "maintains docstrings on structs defined via constants" do + obj = Registry.at("DocstringStruct") + expect(obj).not_to be nil + expect(obj.docstring).to eq "A crazy struct." + expect(obj.attributes[:instance]).not_to be_empty + a1 = Registry.at("DocstringStruct#bar") + a2 = Registry.at("DocstringStruct#baz") + expect(a1.docstring).to eq "An attr" + expect(a1.tag(:return).types).to eq ["String"] + expect(a2.docstring).to eq "Another attr" + expect(a2.tag(:return).types).to eq ["Number"] + a3 = Registry.at("DocstringStruct#new_syntax") + expect(a3.docstring).to eq "Attribute defined with the new syntax" + expect(a3.tag(:return).types).to eq ["Symbol"] + end + + it "raises undocumentable error in 1.9 parser for Struct.new assignment to non-const" do + undoc_error "nonconst = Struct.new" + end unless LEGACY_PARSER + + %w(module class).each do |type| + it "does not allow #{type} to be redefined as constant" do + undoc_error <<-eof + #{type} Foo; end + Foo = "value" + eof + end + end unless LEGACY_PARSER + + it "allows constant to have same name as constant in parent namespace" do + YARD.parse_string <<-eof + module A + class C; end + module B; C = 1 end + end + eof + expect(log.io.string).to eq "" + expect(Registry.at('A::B::C').type).to eq :constant + end + + it "detects compound constant names" do + YARD.parse_string <<-eof + module A + class AA; end + AA::B = true + end + A::AA::C = true + eof + + expect(Registry.at('A::AA::B').type).to eq :constant + expect(Registry.at('A::AA::C').type).to eq :constant + end if HAVE_RIPPER +end