arbre2 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/.gitignore +30 -0
 - data/.ruby-gemset +1 -0
 - data/.ruby-version +1 -0
 - data/.travis.yml +6 -0
 - data/CHANGELOG.md +75 -0
 - data/Gemfile +2 -0
 - data/Gemfile.lock +93 -0
 - data/LICENSE +20 -0
 - data/README.md +92 -0
 - data/Rakefile +7 -0
 - data/arbre.gemspec +28 -0
 - data/lib/arbre/child_element_collection.rb +86 -0
 - data/lib/arbre/container.rb +20 -0
 - data/lib/arbre/context.rb +83 -0
 - data/lib/arbre/element/building.rb +151 -0
 - data/lib/arbre/element.rb +194 -0
 - data/lib/arbre/element_collection.rb +93 -0
 - data/lib/arbre/html/attributes.rb +91 -0
 - data/lib/arbre/html/class_list.rb +53 -0
 - data/lib/arbre/html/comment.rb +47 -0
 - data/lib/arbre/html/document.rb +93 -0
 - data/lib/arbre/html/html_tags.rb +67 -0
 - data/lib/arbre/html/querying.rb +256 -0
 - data/lib/arbre/html/tag.rb +317 -0
 - data/lib/arbre/rails/layouts.rb +126 -0
 - data/lib/arbre/rails/legacy_document.rb +29 -0
 - data/lib/arbre/rails/rendering.rb +76 -0
 - data/lib/arbre/rails/rspec/arbre_support.rb +61 -0
 - data/lib/arbre/rails/rspec.rb +2 -0
 - data/lib/arbre/rails/template_handler.rb +32 -0
 - data/lib/arbre/rails.rb +35 -0
 - data/lib/arbre/rspec/be_rendered_as_matcher.rb +103 -0
 - data/lib/arbre/rspec/be_scripted_as_matcher.rb +68 -0
 - data/lib/arbre/rspec/contain_script_matcher.rb +64 -0
 - data/lib/arbre/rspec.rb +3 -0
 - data/lib/arbre/text_node.rb +35 -0
 - data/lib/arbre/version.rb +3 -0
 - data/lib/arbre.rb +27 -0
 - data/spec/arbre/integration/html_document_spec.rb +90 -0
 - data/spec/arbre/integration/html_spec.rb +283 -0
 - data/spec/arbre/integration/querying_spec.rb +187 -0
 - data/spec/arbre/integration/rails_spec.rb +183 -0
 - data/spec/arbre/rails/rspec/arbre_support_spec.rb +75 -0
 - data/spec/arbre/rspec/be_rendered_as_matcher_spec.rb +80 -0
 - data/spec/arbre/rspec/be_scripted_as_matcher_spec.rb +61 -0
 - data/spec/arbre/rspec/contain_script_matcher_spec.rb +40 -0
 - data/spec/arbre/support/arbre_example_group.rb +0 -0
 - data/spec/arbre/unit/child_element_collection_spec.rb +146 -0
 - data/spec/arbre/unit/container_spec.rb +23 -0
 - data/spec/arbre/unit/context_spec.rb +95 -0
 - data/spec/arbre/unit/element/building_spec.rb +300 -0
 - data/spec/arbre/unit/element_collection_spec.rb +169 -0
 - data/spec/arbre/unit/element_spec.rb +297 -0
 - data/spec/arbre/unit/html/attributes_spec.rb +219 -0
 - data/spec/arbre/unit/html/class_list_spec.rb +109 -0
 - data/spec/arbre/unit/html/comment_spec.rb +42 -0
 - data/spec/arbre/unit/html/querying_spec.rb +32 -0
 - data/spec/arbre/unit/html/tag_spec.rb +300 -0
 - data/spec/arbre/unit/rails/layouts_spec.rb +127 -0
 - data/spec/arbre/unit/text_node_spec.rb +40 -0
 - data/spec/rails/app/controllers/example_controller.rb +18 -0
 - data/spec/rails/app/views/example/_arbre_partial.html.arb +7 -0
 - data/spec/rails/app/views/example/_erb_partial.html.erb +1 -0
 - data/spec/rails/app/views/example/arbre.html.arb +1 -0
 - data/spec/rails/app/views/example/arbre_partial_result.html.arb +3 -0
 - data/spec/rails/app/views/example/erb.html.erb +5 -0
 - data/spec/rails/app/views/example/erb_partial_result.html.arb +3 -0
 - data/spec/rails/app/views/example/partials.html.arb +11 -0
 - data/spec/rails/app/views/layouts/empty.html.arb +1 -0
 - data/spec/rails/app/views/layouts/with_title.html.arb +5 -0
 - data/spec/rails/config/routes.rb +4 -0
 - data/spec/rails_spec_helper.rb +13 -0
 - data/spec/spec_helper.rb +20 -0
 - data/spec/support/arbre_example_group.rb +19 -0
 - metadata +254 -0
 
| 
         @@ -0,0 +1,183 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rails_spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Arbre::Rails, :type => :request do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              # Describes Rails integration. Refer to spec/rails/example_app for an example application.
         
     | 
| 
      
 6 
     | 
    
         
            +
              # The application offers one controller action mapped to the root path, which can take
         
     | 
| 
      
 7 
     | 
    
         
            +
              # the name of a template and/or a layout to render.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              let(:body) { response.body }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              ######
         
     | 
| 
      
 12 
     | 
    
         
            +
              # Content / layout
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                it "should render an ERB template without a layout" do
         
     | 
| 
      
 15 
     | 
    
         
            +
                  get '/', :template => 'erb', :layout => false
         
     | 
| 
      
 16 
     | 
    
         
            +
                  expect(body).to be_rendered_as('<h1>This is an ERB template</h1>', escape: false)
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                it "should render an Arbre template without a layout" do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  get '/', :template => 'arbre', :layout => false
         
     | 
| 
      
 21 
     | 
    
         
            +
                  expect(body).to be_rendered_as('<h1>This is an Arbre template</h1>', escape: false)
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                it "should render an ERB template with an empty Arbre layout" do
         
     | 
| 
      
 25 
     | 
    
         
            +
                  get '/', :template => 'erb', :layout => 'empty'
         
     | 
| 
      
 26 
     | 
    
         
            +
                  expect(body).to be_rendered_as(<<-HTML, escape: false)
         
     | 
| 
      
 27 
     | 
    
         
            +
                    <!DOCTYPE html>
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                    <html>
         
     | 
| 
      
 30 
     | 
    
         
            +
                      <head>
         
     | 
| 
      
 31 
     | 
    
         
            +
                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         
     | 
| 
      
 32 
     | 
    
         
            +
                        <meta http-equiv="Author" content="Me" />
         
     | 
| 
      
 33 
     | 
    
         
            +
                      </head>
         
     | 
| 
      
 34 
     | 
    
         
            +
                      <body>
         
     | 
| 
      
 35 
     | 
    
         
            +
                        <h1>This is an ERB template</h1>
         
     | 
| 
      
 36 
     | 
    
         
            +
                      </body>
         
     | 
| 
      
 37 
     | 
    
         
            +
                    </html>
         
     | 
| 
      
 38 
     | 
    
         
            +
                  HTML
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                it "should render an ERB template with an Arbre layout that sets a title" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  get '/', :template => 'erb', :layout => 'with_title'
         
     | 
| 
      
 43 
     | 
    
         
            +
                  expect(body).to be_rendered_as(<<-HTML, escape: false)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    <!DOCTYPE html>
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                    <html>
         
     | 
| 
      
 47 
     | 
    
         
            +
                      <head>
         
     | 
| 
      
 48 
     | 
    
         
            +
                        <title>Application Title</title>
         
     | 
| 
      
 49 
     | 
    
         
            +
                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         
     | 
| 
      
 50 
     | 
    
         
            +
                        <meta http-equiv="Author" content="Me" />
         
     | 
| 
      
 51 
     | 
    
         
            +
                      </head>
         
     | 
| 
      
 52 
     | 
    
         
            +
                      <body>
         
     | 
| 
      
 53 
     | 
    
         
            +
                        <h1>This is an ERB template</h1>
         
     | 
| 
      
 54 
     | 
    
         
            +
                      </body>
         
     | 
| 
      
 55 
     | 
    
         
            +
                    </html>
         
     | 
| 
      
 56 
     | 
    
         
            +
                  HTML
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                it "should allow the legacy document class to be overridden" do
         
     | 
| 
      
 60 
     | 
    
         
            +
                  Arbre::Rails.legacy_document = Class.new(Arbre::Html::Document) do
         
     | 
| 
      
 61 
     | 
    
         
            +
                    def build!
         
     | 
| 
      
 62 
     | 
    
         
            +
                      super
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                      head do
         
     | 
| 
      
 65 
     | 
    
         
            +
                        text_node helpers.content_for(:head)
         
     | 
| 
      
 66 
     | 
    
         
            +
                        text_node helpers.content_for(:styles)
         
     | 
| 
      
 67 
     | 
    
         
            +
                      end
         
     | 
| 
      
 68 
     | 
    
         
            +
                      body do
         
     | 
| 
      
 69 
     | 
    
         
            +
                        div id: 'content-container' do
         
     | 
| 
      
 70 
     | 
    
         
            +
                          text_node helpers.content_for(:layout)
         
     | 
| 
      
 71 
     | 
    
         
            +
                        end
         
     | 
| 
      
 72 
     | 
    
         
            +
                      end
         
     | 
| 
      
 73 
     | 
    
         
            +
                    end
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                  get '/', :template => 'erb', :layout => 'empty'
         
     | 
| 
      
 77 
     | 
    
         
            +
                  expect(body).to be_rendered_as(<<-HTML, escape: false)
         
     | 
| 
      
 78 
     | 
    
         
            +
                    <!DOCTYPE html>
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                    <html>
         
     | 
| 
      
 81 
     | 
    
         
            +
                      <head>
         
     | 
| 
      
 82 
     | 
    
         
            +
                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         
     | 
| 
      
 83 
     | 
    
         
            +
                        <meta http-equiv="Author" content="Me" />
         
     | 
| 
      
 84 
     | 
    
         
            +
                      </head>
         
     | 
| 
      
 85 
     | 
    
         
            +
                      <body>
         
     | 
| 
      
 86 
     | 
    
         
            +
                        <div id="content-container">
         
     | 
| 
      
 87 
     | 
    
         
            +
                         <h1>This is an ERB template</h1>
         
     | 
| 
      
 88 
     | 
    
         
            +
                       </div>
         
     | 
| 
      
 89 
     | 
    
         
            +
                      </body>
         
     | 
| 
      
 90 
     | 
    
         
            +
                    </html>
         
     | 
| 
      
 91 
     | 
    
         
            +
                  HTML
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                  Arbre::Rails.legacy_document = nil
         
     | 
| 
      
 94 
     | 
    
         
            +
                end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                it "should render an Arbre template with an empty Arbre layout" do
         
     | 
| 
      
 97 
     | 
    
         
            +
                  get '/', :template => 'arbre', :layout => 'empty'
         
     | 
| 
      
 98 
     | 
    
         
            +
                  expect(body).to be_rendered_as(<<-HTML, escape: false)
         
     | 
| 
      
 99 
     | 
    
         
            +
                    <!DOCTYPE html>
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
                    <html>
         
     | 
| 
      
 102 
     | 
    
         
            +
                      <head>
         
     | 
| 
      
 103 
     | 
    
         
            +
                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         
     | 
| 
      
 104 
     | 
    
         
            +
                      </head>
         
     | 
| 
      
 105 
     | 
    
         
            +
                      <body>
         
     | 
| 
      
 106 
     | 
    
         
            +
                        <h1>This is an Arbre template</h1>
         
     | 
| 
      
 107 
     | 
    
         
            +
                      </body>
         
     | 
| 
      
 108 
     | 
    
         
            +
                    </html>
         
     | 
| 
      
 109 
     | 
    
         
            +
                  HTML
         
     | 
| 
      
 110 
     | 
    
         
            +
                end
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
                it "should render an Arbre template with an Arbre layout that sets a title" do
         
     | 
| 
      
 113 
     | 
    
         
            +
                  get '/', :template => 'arbre', :layout => 'with_title'
         
     | 
| 
      
 114 
     | 
    
         
            +
                  expect(body).to be_rendered_as(<<-HTML, escape: false)
         
     | 
| 
      
 115 
     | 
    
         
            +
                    <!DOCTYPE html>
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
                    <html>
         
     | 
| 
      
 118 
     | 
    
         
            +
                      <head>
         
     | 
| 
      
 119 
     | 
    
         
            +
                        <title>Application Title</title>
         
     | 
| 
      
 120 
     | 
    
         
            +
                        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
         
     | 
| 
      
 121 
     | 
    
         
            +
                      </head>
         
     | 
| 
      
 122 
     | 
    
         
            +
                      <body>
         
     | 
| 
      
 123 
     | 
    
         
            +
                        <h1>This is an Arbre template</h1>
         
     | 
| 
      
 124 
     | 
    
         
            +
                      </body>
         
     | 
| 
      
 125 
     | 
    
         
            +
                    </html>
         
     | 
| 
      
 126 
     | 
    
         
            +
                  HTML
         
     | 
| 
      
 127 
     | 
    
         
            +
                end
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
              ######
         
     | 
| 
      
 130 
     | 
    
         
            +
              # Partial / sub-template rendering
         
     | 
| 
      
 131 
     | 
    
         
            +
             
     | 
| 
      
 132 
     | 
    
         
            +
                it "should re-use a context when using method `partial' and the partial is also Arbre" do
         
     | 
| 
      
 133 
     | 
    
         
            +
                  get '/', :template => 'partials', :layout => false
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
                  expect(body).to be_rendered_as(%r[
         
     | 
| 
      
 136 
     | 
    
         
            +
                    <p>Main template: Context Object ID=(\d+)</p>
         
     | 
| 
      
 137 
     | 
    
         
            +
                    <div id="arbre">
         
     | 
| 
      
 138 
     | 
    
         
            +
                      <p>Partial: Local1=local1, Context Object ID=(\d+)</p>
         
     | 
| 
      
 139 
     | 
    
         
            +
                      <p>Paragraph 2</p>
         
     | 
| 
      
 140 
     | 
    
         
            +
                    </div>
         
     | 
| 
      
 141 
     | 
    
         
            +
                    <div id="arbre-using-render">
         
     | 
| 
      
 142 
     | 
    
         
            +
                      <p>Partial: Context Object ID=(\d+)</p>
         
     | 
| 
      
 143 
     | 
    
         
            +
                      <p>Paragraph 2</p>
         
     | 
| 
      
 144 
     | 
    
         
            +
                    </div>
         
     | 
| 
      
 145 
     | 
    
         
            +
                    <div id="erb">
         
     | 
| 
      
 146 
     | 
    
         
            +
                      <p>ERB template.</p>
         
     | 
| 
      
 147 
     | 
    
         
            +
                    </div>
         
     | 
| 
      
 148 
     | 
    
         
            +
                  ]x, escape: false)
         
     | 
| 
      
 149 
     | 
    
         
            +
             
     | 
| 
      
 150 
     | 
    
         
            +
                  # Make sure that the context is re-used between the first two, but not in the case of 'render'.
         
     | 
| 
      
 151 
     | 
    
         
            +
                  (ctx1_id,_), (ctx2_id,_), (ctx3_id,_) = body.scan(/Context Object ID=(\d+)/)
         
     | 
| 
      
 152 
     | 
    
         
            +
                  expect(ctx1_id).to eql(ctx2_id)
         
     | 
| 
      
 153 
     | 
    
         
            +
                  expect(ctx1_id).not_to eql(ctx3_id)
         
     | 
| 
      
 154 
     | 
    
         
            +
                end
         
     | 
| 
      
 155 
     | 
    
         
            +
             
     | 
| 
      
 156 
     | 
    
         
            +
                it "should return an empty string if an Arbre context is re-used" do
         
     | 
| 
      
 157 
     | 
    
         
            +
                  get '/partial', :context => true
         
     | 
| 
      
 158 
     | 
    
         
            +
                  expect(body).to be_rendered_as('', escape: false)
         
     | 
| 
      
 159 
     | 
    
         
            +
                end
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
                it "should not return an empty string if an Arbre context is not re-used" do
         
     | 
| 
      
 162 
     | 
    
         
            +
                  get '/partial', :context => false
         
     | 
| 
      
 163 
     | 
    
         
            +
                  expect(body).to be_rendered_as(%r[^<p>Partial: Context Object ID=(\d+)</p>], escape: false)
         
     | 
| 
      
 164 
     | 
    
         
            +
                end
         
     | 
| 
      
 165 
     | 
    
         
            +
             
     | 
| 
      
 166 
     | 
    
         
            +
                it "should handle an Arbre template without converting the template to a string" do
         
     | 
| 
      
 167 
     | 
    
         
            +
                  get '/', :template => 'arbre_partial_result', :layout => false
         
     | 
| 
      
 168 
     | 
    
         
            +
                  expect(body).to be_rendered_as(%r[
         
     | 
| 
      
 169 
     | 
    
         
            +
                    <p>Partial: Context Object ID=(\d+)</p>
         
     | 
| 
      
 170 
     | 
    
         
            +
                    <p>Paragraph 2</p>
         
     | 
| 
      
 171 
     | 
    
         
            +
                    <p>The previous element is a Arbre::Html::P</p>
         
     | 
| 
      
 172 
     | 
    
         
            +
                  ]x, escape: false)
         
     | 
| 
      
 173 
     | 
    
         
            +
                end
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
                it "should wrap any other partial in a TextNode" do
         
     | 
| 
      
 176 
     | 
    
         
            +
                  get '/', :template => 'erb_partial_result', :layout => false
         
     | 
| 
      
 177 
     | 
    
         
            +
                  expect(body).to be_rendered_as(%r[
         
     | 
| 
      
 178 
     | 
    
         
            +
                    <p>ERB template.</p>
         
     | 
| 
      
 179 
     | 
    
         
            +
                    <p>The previous element is a Arbre::TextNode</p>
         
     | 
| 
      
 180 
     | 
    
         
            +
                  ]x, escape: false)
         
     | 
| 
      
 181 
     | 
    
         
            +
                end
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
      
 183 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,75 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rails_spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Arbre::Rails::RSpec::ArbreSupport, arbre: true do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              let(:example) { self }
         
     | 
| 
      
 6 
     | 
    
         
            +
              subject { example }
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              describe '#arbre_context' do
         
     | 
| 
      
 9 
     | 
    
         
            +
                let(:assigns) { double(:assigns) }
         
     | 
| 
      
 10 
     | 
    
         
            +
                let(:helpers) { double(:helpers) }
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                it "should build and memoize an Arbre context" do
         
     | 
| 
      
 13 
     | 
    
         
            +
                  context = double(:context)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  expect(Arbre::Context).to receive(:new).once.with(assigns, helpers).and_return(context)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  expect(example.arbre_context).to be(context)
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                it "should be aliased as #arbre" do
         
     | 
| 
      
 19 
     | 
    
         
            +
                  context = double(:context)
         
     | 
| 
      
 20 
     | 
    
         
            +
                  expect(Arbre::Context).to receive(:new).once.with(assigns, helpers).and_return(context)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  expect(example.arbre_context).to be(context)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  expect(example.arbre).to be(context)
         
     | 
| 
      
 23 
     | 
    
         
            +
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
              end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
              its(:assigns) { should eql({}) }
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              describe '#helpers' do
         
     | 
| 
      
 29 
     | 
    
         
            +
                it "should build and memoize helpers" do
         
     | 
| 
      
 30 
     | 
    
         
            +
                  helpers = double(:helpers)
         
     | 
| 
      
 31 
     | 
    
         
            +
                  expect(example).to receive(:build_helpers).once.and_return(helpers)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  expect(example.helpers).to be(helpers)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  expect(example.helpers).to be(helpers)
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
              describe '#build_helpers' do
         
     | 
| 
      
 38 
     | 
    
         
            +
                let(:helpers) { example.build_helpers }
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                specify { expect(helpers).to be_a(ActionView::Base) }
         
     | 
| 
      
 41 
     | 
    
         
            +
                specify { expect(helpers.controller).to be(controller) }
         
     | 
| 
      
 42 
     | 
    
         
            +
                specify { expect(helpers.request).to be(request) }
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                it "should mock an asset_path helper" do
         
     | 
| 
      
 45 
     | 
    
         
            +
                  expect(helpers.asset_path('test')).to eql('/assets/test')
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                it "should include any ApplicationController helpers if an ApplicationController exists" do
         
     | 
| 
      
 49 
     | 
    
         
            +
                  if defined?(::ApplicationController)
         
     | 
| 
      
 50 
     | 
    
         
            +
                    prev_app_controller = ::ApplicationController
         
     | 
| 
      
 51 
     | 
    
         
            +
                    Object.send :remove_const, :ApplicationController
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
                  ::ApplicationController = Class.new(ActionController::Base)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  app_helpers = Module.new do
         
     | 
| 
      
 55 
     | 
    
         
            +
                    def my_method; 'result' end
         
     | 
| 
      
 56 
     | 
    
         
            +
                  end
         
     | 
| 
      
 57 
     | 
    
         
            +
                  expect(::ApplicationController).to receive(:_helpers).and_return(app_helpers)
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                  expect(helpers.my_method).to eql('result')
         
     | 
| 
      
 60 
     | 
    
         
            +
                  Object.send :remove_const, :ApplicationController
         
     | 
| 
      
 61 
     | 
    
         
            +
                  ::ApplicationController = prev_app_controller if prev_app_controller
         
     | 
| 
      
 62 
     | 
    
         
            +
                end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              describe '#controller' do
         
     | 
| 
      
 67 
     | 
    
         
            +
                specify { expect(example.controller).to be_a(ActionController::Base) }
         
     | 
| 
      
 68 
     | 
    
         
            +
                specify { expect(example.controller.request).to be(example.request) }
         
     | 
| 
      
 69 
     | 
    
         
            +
              end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
              describe '#request' do
         
     | 
| 
      
 72 
     | 
    
         
            +
                specify { expect(example.request).to be_a(ActionDispatch::Request) }
         
     | 
| 
      
 73 
     | 
    
         
            +
              end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,80 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Arbre::RSpec::BeRenderedAsMatcher do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              it "should fail if the actual was nil" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                expect{ expect(nil).to be_rendered_as('<html/>') }
         
     | 
| 
      
 7 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 8 
     | 
    
         
            +
                    expected that element of type NilClass would be rendered differently:
         
     | 
| 
      
 9 
     | 
    
         
            +
                      expected: <html/> (String)
         
     | 
| 
      
 10 
     | 
    
         
            +
                           got: nil
         
     | 
| 
      
 11 
     | 
    
         
            +
                STR
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              it "should fail if the actual's string version was not the same" do
         
     | 
| 
      
 15 
     | 
    
         
            +
                expect{ expect(double(:to_s => '<html></html>'.html_safe)).to be_rendered_as('<html/>') }
         
     | 
| 
      
 16 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 17 
     | 
    
         
            +
                    expected that element of type RSpec::Mocks::Mock would be rendered differently:
         
     | 
| 
      
 18 
     | 
    
         
            +
                      expected: <html/> (String)
         
     | 
| 
      
 19 
     | 
    
         
            +
                           got: <html></html>
         
     | 
| 
      
 20 
     | 
    
         
            +
                STR
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              it "should fail if the actual's string version did not match the regular expression" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                expect{ expect(double(:to_s => '<html></html>'.html_safe)).to be_rendered_as(/regular* expression{1,2}/) }
         
     | 
| 
      
 25 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 26 
     | 
    
         
            +
                    expected that element of type RSpec::Mocks::Mock would be rendered differently:
         
     | 
| 
      
 27 
     | 
    
         
            +
                      expected: /regular* expression{1,2}/ (Regexp)
         
     | 
| 
      
 28 
     | 
    
         
            +
                           got: <html></html>
         
     | 
| 
      
 29 
     | 
    
         
            +
                STR
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
              it "should fail if the actual's string was not HTML-safed" do
         
     | 
| 
      
 33 
     | 
    
         
            +
                expect{ expect(double(:to_s => '<html></html>')).to be_rendered_as('<html></html>') }
         
     | 
| 
      
 34 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 35 
     | 
    
         
            +
                    expected that element of type RSpec::Mocks::Mock would be rendered differently:
         
     | 
| 
      
 36 
     | 
    
         
            +
                      expected: <html></html> (String)
         
     | 
| 
      
 37 
     | 
    
         
            +
                           got: <html></html>
         
     | 
| 
      
 38 
     | 
    
         
            +
                STR
         
     | 
| 
      
 39 
     | 
    
         
            +
              end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
              it "should pass if the actual's string version did match the given string" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                expect{ expect('<html></html>'.html_safe).to be_rendered_as('<html></html>') }
         
     | 
| 
      
 43 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 44 
     | 
    
         
            +
              end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              it "should pass if the actual's string version did match the given regular expression" do
         
     | 
| 
      
 47 
     | 
    
         
            +
                expect{ expect('<html></html>'.html_safe).to be_rendered_as(/<html>.*?<\/html>/) }
         
     | 
| 
      
 48 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
              it "should pass if the actual's string version did match the given string, where whitespace is ignored" do
         
     | 
| 
      
 52 
     | 
    
         
            +
                expect{ expect('<html>  </html>'.html_safe).to be_rendered_as('<html></html>') }
         
     | 
| 
      
 53 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 54 
     | 
    
         
            +
                expect{ expect("<html>\n</html>\n".html_safe).to be_rendered_as('<html>  </html>') }
         
     | 
| 
      
 55 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 56 
     | 
    
         
            +
              end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
              it "should pass if the actual's string version did match the given regular expression, where whitespace is ignored" do
         
     | 
| 
      
 59 
     | 
    
         
            +
                expect{ expect('<html>  </html>'.html_safe).to be_rendered_as(/<html>.*?<\/html>/) }
         
     | 
| 
      
 60 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 61 
     | 
    
         
            +
                expect{ expect("<html>\n</html>\n".html_safe).to be_rendered_as(/<html.*>  <\/html>/) }
         
     | 
| 
      
 62 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 63 
     | 
    
         
            +
              end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
              it "should pass if the actual's string version did match the given string, where attribute order is ignored" do
         
     | 
| 
      
 66 
     | 
    
         
            +
                expect{ expect('<html lang="en" data-something="two"></html>'.html_safe).to be_rendered_as('<html data-something="two" lang="en"></html>') }
         
     | 
| 
      
 67 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
              it "should pass if the actual's string version did match the given regex, where attribute order is ignored" do
         
     | 
| 
      
 71 
     | 
    
         
            +
                expect{ expect('<html lang="en" data-something="two"></html>'.html_safe).to be_rendered_as(/<html data-something="two" lang="en">.*<\/html>/) }
         
     | 
| 
      
 72 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 73 
     | 
    
         
            +
              end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
      
 75 
     | 
    
         
            +
              it "should pass if the actual's string version matched the given string, where placeholders were used" do
         
     | 
| 
      
 76 
     | 
    
         
            +
                expect{ expect('<html><body></body></html>'.html_safe).to be_rendered_as('<html>(...)</html>') }
         
     | 
| 
      
 77 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 78 
     | 
    
         
            +
              end
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Arbre::RSpec::BeScriptedAsMatcher do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              it "should fail if the actual's content was not the same" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                expect{ expect(double(:content => 'alert("test");')).to be_scripted_as('alert("something else");') }
         
     | 
| 
      
 7 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 8 
     | 
    
         
            +
                    expected that element of type RSpec::Mocks::Mock would be scripted differently:
         
     | 
| 
      
 9 
     | 
    
         
            +
                      expected: alert("something else"); (String)
         
     | 
| 
      
 10 
     | 
    
         
            +
                           got: alert("test");
         
     | 
| 
      
 11 
     | 
    
         
            +
                STR
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              it "should fail if the actual's content did not match the regular expression" do
         
     | 
| 
      
 15 
     | 
    
         
            +
                expect{ expect(double(:content => 'alert("test");')).to be_scripted_as(/regular* expression{1,2}/) }
         
     | 
| 
      
 16 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 17 
     | 
    
         
            +
                    expected that element of type RSpec::Mocks::Mock would be scripted differently:
         
     | 
| 
      
 18 
     | 
    
         
            +
                      expected: /regular* expression{1,2}/ (Regexp)
         
     | 
| 
      
 19 
     | 
    
         
            +
                           got: alert("test");
         
     | 
| 
      
 20 
     | 
    
         
            +
                STR
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              it "should pass if the actual's content did match the given string" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                expect{ expect(double(:content => 'alert("test");')).to be_scripted_as('alert("test");') }
         
     | 
| 
      
 25 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 26 
     | 
    
         
            +
              end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
              it "should pass if the actual's content did match the given regular expression" do
         
     | 
| 
      
 29 
     | 
    
         
            +
                expect{ expect(double(:content => 'alert("test");')).to be_scripted_as(/alert\("\w+"\);/) }
         
     | 
| 
      
 30 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              it "should pass if the actual's content did match the given string, where whitespace is ignored" do
         
     | 
| 
      
 34 
     | 
    
         
            +
                expect{ expect(double(:content => '  alert("test");  ')).to be_scripted_as('alert("test");') }
         
     | 
| 
      
 35 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 36 
     | 
    
         
            +
                expect{ expect(double(:content => "alert(\"test\");\n")).to be_scripted_as('  alert("test");  ') }
         
     | 
| 
      
 37 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              it "should fail if the whitespace difference was significant" do
         
     | 
| 
      
 41 
     | 
    
         
            +
                expect{ expect(double(:content => 'alert("test   " );')).to be_scripted_as('alert("test");') }
         
     | 
| 
      
 42 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 43 
     | 
    
         
            +
                    expected that element of type RSpec::Mocks::Mock would be scripted differently:
         
     | 
| 
      
 44 
     | 
    
         
            +
                      expected: alert("test"); (String)
         
     | 
| 
      
 45 
     | 
    
         
            +
                           got: alert("test   " );
         
     | 
| 
      
 46 
     | 
    
         
            +
                STR
         
     | 
| 
      
 47 
     | 
    
         
            +
              end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
              it "should pass if the actual's content did match the given regular expression, where whitespace is ignored" do
         
     | 
| 
      
 50 
     | 
    
         
            +
                expect{ expect(double(:content => '  alert("test");  ')).to be_scripted_as(/alert\("\w+"\);/) }
         
     | 
| 
      
 51 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 52 
     | 
    
         
            +
                expect{ expect(double(:content => "alert(\"test\");\n")).to be_scripted_as(/  alert\("\w+"\);  /) }
         
     | 
| 
      
 53 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              it "should pass if the actual's content matched the given string, where placeholders were used" do
         
     | 
| 
      
 57 
     | 
    
         
            +
                expect{ expect(double(:content => 'var a=1; alert("test");')).to be_scripted_as('(...)alert("test");') }
         
     | 
| 
      
 58 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 59 
     | 
    
         
            +
              end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,40 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Arbre::RSpec::ContainScriptMatcher do
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              it "should fail if the actual's content did not contain the given script" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                expect{ expect(double(:to_s => '<script type="javascript">alert("test");</script>')).to contain_script('alert("something else");') }
         
     | 
| 
      
 7 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 8 
     | 
    
         
            +
                    expected that element of type RSpec::Mocks::Mock contained script:
         
     | 
| 
      
 9 
     | 
    
         
            +
                      expected: alert("something else"); (String)
         
     | 
| 
      
 10 
     | 
    
         
            +
                           got: <script type="javascript">alert("test");</script>
         
     | 
| 
      
 11 
     | 
    
         
            +
                STR
         
     | 
| 
      
 12 
     | 
    
         
            +
              end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
              it "should pass if the actual's content did match the given string" do
         
     | 
| 
      
 15 
     | 
    
         
            +
                expect{ expect(double(:to_s => '<script type="javascript">alert("test");</script>')).to contain_script('alert("test");') }
         
     | 
| 
      
 16 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              it "should pass if the actual's content contained given string" do
         
     | 
| 
      
 20 
     | 
    
         
            +
                expect{ expect(double(:to_s => '<body><script type="javascript">var a = 1; alert("test");</script></body>')).to contain_script('alert("test");') }
         
     | 
| 
      
 21 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 22 
     | 
    
         
            +
              end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              it "should pass if the actual's content did match the given string, where whitespace is ignored" do
         
     | 
| 
      
 25 
     | 
    
         
            +
                expect{ expect(double(:to_s => '<script type="javascript">  alert("test");  </script>')).to contain_script('alert("test");') }
         
     | 
| 
      
 26 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 27 
     | 
    
         
            +
                expect{ expect(double(:to_s => "<script type=\"javascript\">alert(\"test\");\n</script>")).to contain_script('  alert("test");  ') }
         
     | 
| 
      
 28 
     | 
    
         
            +
                  .not_to raise_error
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
              it "should fail if the whitespace difference was significant" do
         
     | 
| 
      
 32 
     | 
    
         
            +
                expect{ expect(double(:to_s => '<script type="javascript">alert("test   " );</script>')).to contain_script('alert("test");') }
         
     | 
| 
      
 33 
     | 
    
         
            +
                  .to raise_error(RSpec::Expectations::ExpectationNotMetError, <<-STR.gsub(/^\s{8}/, ''))
         
     | 
| 
      
 34 
     | 
    
         
            +
                    expected that element of type RSpec::Mocks::Mock contained script:
         
     | 
| 
      
 35 
     | 
    
         
            +
                      expected: alert("test"); (String)
         
     | 
| 
      
 36 
     | 
    
         
            +
                           got: <script type="javascript">alert("test   " );</script>
         
     | 
| 
      
 37 
     | 
    
         
            +
                STR
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            end
         
     | 
| 
         
            File without changes
         
     | 
| 
         @@ -0,0 +1,146 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
            include Arbre
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            describe ChildElementCollection do
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              specify { expect(ChildElementCollection).to be < ElementCollection }
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              let(:parent) { Element.new }
         
     | 
| 
      
 9 
     | 
    
         
            +
              let(:collection) { ChildElementCollection.new(parent) }
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              let(:element) { Element.new }
         
     | 
| 
      
 12 
     | 
    
         
            +
              let(:element1) { Element.new }
         
     | 
| 
      
 13 
     | 
    
         
            +
              let(:element2) { Element.new }
         
     | 
| 
      
 14 
     | 
    
         
            +
              let(:element3) { Element.new }
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              ######
         
     | 
| 
      
 17 
     | 
    
         
            +
              # Parent
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                it "should store its parent" do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  expect(collection.parent).to be(parent)
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                it "should only be eql? to another collection if the parent is the same" do
         
     | 
| 
      
 24 
     | 
    
         
            +
                  collection1 = ChildElementCollection.new(parent)
         
     | 
| 
      
 25 
     | 
    
         
            +
                  collection1 << element1
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  collection2 = ChildElementCollection.new(parent)
         
     | 
| 
      
 28 
     | 
    
         
            +
                  collection2 << element1
         
     | 
| 
      
 29 
     | 
    
         
            +
                  expect(collection1).to eql(collection2)
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                  collection2 = ChildElementCollection.new(Element.new)
         
     | 
| 
      
 32 
     | 
    
         
            +
                  collection2 << element1
         
     | 
| 
      
 33 
     | 
    
         
            +
                  expect(collection1).not_to eql(collection2)
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                it "should set the parent to each child element that is added to the collection" do
         
     | 
| 
      
 37 
     | 
    
         
            +
                  collection << element1
         
     | 
| 
      
 38 
     | 
    
         
            +
                  expect(element1.parent).to be(parent)
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                  collection = ChildElementCollection.new(parent)
         
     | 
| 
      
 41 
     | 
    
         
            +
                  collection.insert_at 0, element2
         
     | 
| 
      
 42 
     | 
    
         
            +
                  expect(element2.parent).to be(parent)
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                it "should remove any element that is added to the collection from its existing parent" do
         
     | 
| 
      
 46 
     | 
    
         
            +
                  expect(element1).to receive(:remove!)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  expect(element2).to receive(:remove!)
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  collection << element1
         
     | 
| 
      
 50 
     | 
    
         
            +
                  collection.insert_at 0, element2
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                it "should unset the parent from each child element that is removed from the collection" do
         
     | 
| 
      
 54 
     | 
    
         
            +
                  collection << element
         
     | 
| 
      
 55 
     | 
    
         
            +
                  collection.remove element
         
     | 
| 
      
 56 
     | 
    
         
            +
                  expect(element.parent).to be_nil
         
     | 
| 
      
 57 
     | 
    
         
            +
                end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                it "should not add or set the parent of the same element twice" do
         
     | 
| 
      
 60 
     | 
    
         
            +
                  expect(element).to receive(:parent=).once.with(parent)
         
     | 
| 
      
 61 
     | 
    
         
            +
                  collection << element << element
         
     | 
| 
      
 62 
     | 
    
         
            +
                  expect(collection).to have(1).item
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                  collection = ChildElementCollection.new(parent)
         
     | 
| 
      
 65 
     | 
    
         
            +
                  expect(element).to receive(:parent=).once.with(parent)
         
     | 
| 
      
 66 
     | 
    
         
            +
                  collection << element
         
     | 
| 
      
 67 
     | 
    
         
            +
                  collection.insert_at 0, element
         
     | 
| 
      
 68 
     | 
    
         
            +
                  expect(collection).to have(1).item
         
     | 
| 
      
 69 
     | 
    
         
            +
                end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                it "should not unset the parent if the given element was not part of the collection" do
         
     | 
| 
      
 72 
     | 
    
         
            +
                  element.parent = Element.new
         
     | 
| 
      
 73 
     | 
    
         
            +
                  collection.remove element
         
     | 
| 
      
 74 
     | 
    
         
            +
                  expect(element.parent).not_to be_nil
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                it "should not the parents of all elements if #clear is used" do
         
     | 
| 
      
 78 
     | 
    
         
            +
                  collection << element1 << element2
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                  expect(element1.parent).not_to be_nil
         
     | 
| 
      
 81 
     | 
    
         
            +
                  expect(element2.parent).not_to be_nil
         
     | 
| 
      
 82 
     | 
    
         
            +
                  collection.clear
         
     | 
| 
      
 83 
     | 
    
         
            +
                  expect(element1.parent).to be_nil
         
     | 
| 
      
 84 
     | 
    
         
            +
                  expect(element2.parent).to be_nil
         
     | 
| 
      
 85 
     | 
    
         
            +
                end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
              ######
         
     | 
| 
      
 88 
     | 
    
         
            +
              # Inserting
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                describe '#insert_at' do
         
     | 
| 
      
 91 
     | 
    
         
            +
                  it "should insert the element at the given index" do
         
     | 
| 
      
 92 
     | 
    
         
            +
                    collection << element1 << element3
         
     | 
| 
      
 93 
     | 
    
         
            +
                    collection.insert_at 1, element2
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
                    expect(collection).to eq([element1, element2, element3])
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                  it "should move, and not duplicate, an element that already existed in the collection" do
         
     | 
| 
      
 99 
     | 
    
         
            +
                    collection << element1 << element3 << element2
         
     | 
| 
      
 100 
     | 
    
         
            +
                    collection.insert_at 1, element2
         
     | 
| 
      
 101 
     | 
    
         
            +
                    expect(collection).to eq([element1, element2, element3])
         
     | 
| 
      
 102 
     | 
    
         
            +
                  end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                  it "should be able to move an element towards the back" do
         
     | 
| 
      
 105 
     | 
    
         
            +
                    collection << element2 << element1 << element3
         
     | 
| 
      
 106 
     | 
    
         
            +
                    collection.insert_at 2, element2
         
     | 
| 
      
 107 
     | 
    
         
            +
                    expect(collection).to eq([element1, element2, element3])
         
     | 
| 
      
 108 
     | 
    
         
            +
                  end
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                end
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
                describe '#insert_after' do
         
     | 
| 
      
 113 
     | 
    
         
            +
                  it "should insert the element after the other element" do
         
     | 
| 
      
 114 
     | 
    
         
            +
                    collection << element1
         
     | 
| 
      
 115 
     | 
    
         
            +
                    collection.insert_after element1, element3
         
     | 
| 
      
 116 
     | 
    
         
            +
                    collection.insert_after element1, element2
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
                    expect(collection).to eq([element1, element2, element3])
         
     | 
| 
      
 119 
     | 
    
         
            +
                  end
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
                  it "should raise an error if the given reference element did not exist in the collection" do
         
     | 
| 
      
 122 
     | 
    
         
            +
                    collection << element1
         
     | 
| 
      
 123 
     | 
    
         
            +
                    expect(element2).to receive(:to_s).and_return('element2')
         
     | 
| 
      
 124 
     | 
    
         
            +
                    expect { collection.insert_after element2, element3 }.to \
         
     | 
| 
      
 125 
     | 
    
         
            +
                      raise_error(ArgumentError, 'existing element element2 not found')
         
     | 
| 
      
 126 
     | 
    
         
            +
                  end
         
     | 
| 
      
 127 
     | 
    
         
            +
                end
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                describe '#insert_before' do
         
     | 
| 
      
 130 
     | 
    
         
            +
                  it "should insert the element after the other element" do
         
     | 
| 
      
 131 
     | 
    
         
            +
                    collection << element3
         
     | 
| 
      
 132 
     | 
    
         
            +
                    collection.insert_before element3, element1
         
     | 
| 
      
 133 
     | 
    
         
            +
                    collection.insert_before element3, element2
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
                    expect(collection).to eq([element1, element2, element3])
         
     | 
| 
      
 136 
     | 
    
         
            +
                  end
         
     | 
| 
      
 137 
     | 
    
         
            +
             
     | 
| 
      
 138 
     | 
    
         
            +
                  it "should raise an error if the given reference element did not exist in the collection" do
         
     | 
| 
      
 139 
     | 
    
         
            +
                    collection << element1
         
     | 
| 
      
 140 
     | 
    
         
            +
                    expect(element2).to receive(:to_s).and_return('element2')
         
     | 
| 
      
 141 
     | 
    
         
            +
                    expect { collection.insert_before element2, element3 }.to \
         
     | 
| 
      
 142 
     | 
    
         
            +
                      raise_error(ArgumentError, 'existing element element2 not found')
         
     | 
| 
      
 143 
     | 
    
         
            +
                  end
         
     | 
| 
      
 144 
     | 
    
         
            +
                end
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
      
 146 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,23 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 2 
     | 
    
         
            +
            include Arbre
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            describe Container do
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              it "should render its content" do
         
     | 
| 
      
 7 
     | 
    
         
            +
                container = Container.new
         
     | 
| 
      
 8 
     | 
    
         
            +
                expect(container).to receive(:content).and_return('(CONTENT)')
         
     | 
| 
      
 9 
     | 
    
         
            +
                expect(container.to_s).to eql('(CONTENT)')
         
     | 
| 
      
 10 
     | 
    
         
            +
              end
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              it "should have an indentation level of 0 by default" do
         
     | 
| 
      
 13 
     | 
    
         
            +
                expect(Container.new.indent_level).to eql(0)
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              it "should have the same indentation level as its parent" do
         
     | 
| 
      
 17 
     | 
    
         
            +
                container = Container.new
         
     | 
| 
      
 18 
     | 
    
         
            +
                container.parent = Element.new
         
     | 
| 
      
 19 
     | 
    
         
            +
                expect(container.parent).to receive(:indent_level).and_return(5)
         
     | 
| 
      
 20 
     | 
    
         
            +
                expect(container.indent_level).to eql(5)
         
     | 
| 
      
 21 
     | 
    
         
            +
              end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            end
         
     |