/*
 * Copyright 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

// Author: mdsteele@google.com (Matthew D. Steele)

#include "pagespeed/kernel/html/html_attribute_quote_removal.h"

#include "pagespeed/kernel/html/html_parse.h"
#include "pagespeed/kernel/html/html_parse_test_base.h"
#include "pagespeed/kernel/base/basictypes.h"
#include "pagespeed/kernel/base/gtest.h"

namespace net_instaweb {

class HtmlAttributeQuoteRemovalTest : public HtmlParseTestBase {
 protected:
  HtmlAttributeQuoteRemovalTest()
      : html_attribute_quote_removal_(&html_parse_) {
    html_parse_.AddFilter(&html_attribute_quote_removal_);
  }

  virtual bool AddBody() const { return true; }

 private:
  HtmlAttributeQuoteRemoval html_attribute_quote_removal_;

  DISALLOW_COPY_AND_ASSIGN(HtmlAttributeQuoteRemovalTest);
};

TEST_F(HtmlAttributeQuoteRemovalTest, NoQuotesNoChange) {
  ValidateNoChanges("no_quotes_no_change",
                    "<div class=foo id=bar>foobar</div>");
}

TEST_F(HtmlAttributeQuoteRemovalTest, DoNotRemoveNeededQuotes) {
  ValidateNoChanges("do_not_remove_needed_quotes",
                    "<a href=\"http://www.example.com/\">foobar</a>");
}

TEST_F(HtmlAttributeQuoteRemovalTest, DoNotDeleteEmptyAttrs) {
  ValidateNoChanges("do_not_delete_empty_attrs",
                    "<div id=''></div>");
}

TEST_F(HtmlAttributeQuoteRemovalTest, RemoveUnneededQuotes) {
  ValidateExpected("remove_unneeded_quotes",
                   "<div class=\"foo\" id='bar'>foobar</div>",
                   "<div class=foo id=bar>foobar</div>");
}

TEST_F(HtmlAttributeQuoteRemovalTest, NoValueNoChange) {
  ValidateNoChanges("no_value_no_change",
                    "<input checked type=checkbox>");
}

TEST_F(HtmlAttributeQuoteRemovalTest, DoNotRemoveQuotesInXhtml) {
  SetDoctype(kXhtmlDtd);
  ValidateNoChanges("do_not_remove_quotes_in_xhtml",
                    "<div class=\"foo\" id='bar'>foobar</div>");
}

TEST_F(HtmlAttributeQuoteRemovalTest, RemoveUnneededQuotesWith8BitValue) {
  // TODO(jmarantz): we should not need to add attribute quotes just
  // because there are 8-bit values.  Leaving this for a follow-up.
  // ValidateExpected("remove_unneeded_quotes",
  //                  "<div class=\"muñecos\" id='muñecos'>foobar</div>",
  //                  "<div class=muñecos id=muñecos>foobar</div>");

  // For now be conservative.
  ValidateNoChanges("remove_unneeded_quotes",
                    "<div class=\"muñecos\" id='muñecos'>foobar</div>");
}

}  // namespace net_instaweb
