diff --git a/spec/features/custom_parser_spec.rb b/spec/features/custom_parser_spec.rb new file mode 100644 index 00000000..2215beef --- /dev/null +++ b/spec/features/custom_parser_spec.rb @@ -0,0 +1,51 @@ +# frozen_string_literal: true + +require "spec_helper" + +class ParserTest + include HappyMapper + + class Coerce + def self.number_list(val) + val.to_s.split(",").map { _1.strip.to_i } + end + end + + tag "parsertest" + attribute :numbers, Coerce, parser: :number_list + element :strings, self, parser: :string_list + element :bool, String, parser: ->(val) { val.to_s == "1" } + + def self.string_list(val) + val.to_s.split(",").map(&:strip) + end +end + +RSpec.describe "specifying a custom parser for attributes and elements" do + let(:xml) do + <<~XML + + a, b, c + 0 + + XML + end + + it "parses with a singleton method on the type class" do + parsed = ParserTest.parse xml + + expect(parsed.numbers).to eq [1, 2, 3] + end + + it "parses with a singleton method on the model class" do + parsed = ParserTest.parse xml + + expect(parsed.strings).to eq %w(a b c) + end + + it "parses with a proc specified in the element definition" do + parsed = ParserTest.parse xml + + expect(parsed.bool).to be false + end +end diff --git a/spec/fixtures/custom_parsers.xml b/spec/fixtures/custom_parsers.xml deleted file mode 100644 index d4697a4b..00000000 --- a/spec/fixtures/custom_parsers.xml +++ /dev/null @@ -1,4 +0,0 @@ - - a, b, c - 0 - diff --git a/spec/happymapper_spec.rb b/spec/happymapper_spec.rb index 74d3b6e5..145777a2 100644 --- a/spec/happymapper_spec.rb +++ b/spec/happymapper_spec.rb @@ -560,25 +560,6 @@ class Thing end end -class ParserTest - include HappyMapper - - class Coerce - def self.number_list(val) - val.to_s.split(",").map { _1.strip.to_i } - end - end - - tag "parsertest" - attribute :numbers, Coerce, parser: :number_list - element :strings, self, parser: :string_list - element :bool, String, parser: ->(val) { val.to_s == "1" } - - def self.string_list(val) - val.to_s.split(",").map(&:strip) - end -end - describe HappyMapper do describe "being included into another class" do let(:klass) do @@ -1235,14 +1216,4 @@ def self.string_list(val) end end end - - it "parses with custom parser" do - parsed = ParserTest.parse fixture_file("custom_parsers.xml") - - aggregate_failures do - expect(parsed.numbers).to eq [1, 2, 3] - expect(parsed.strings).to eq %w(a b c) - expect(parsed.bool).to be false - end - end end