#encoding: utf-8
require 'stringio'
require 'spec_helper'
require 'gherkin/json_parser'
require 'gherkin/formatter/json_formatter'
require 'multi_json'

module Gherkin
  describe JSONParser do

    def check_json(json)
      io = StringIO.new
      f = Formatter::JSONFormatter.new(io)
      p = JSONParser.new(f, f)
      p.parse(json)
      f.done
      expected = MultiJson.load(json)
      actual   = MultiJson.load(io.string)

      begin
        actual.should == expected
      rescue
        puts "EXPECTED"
        puts json
        puts "ACTUAL"
        puts io.string
        puts "======"

        raise
      end
    end

    it "should parse a barely empty feature" do
      check_json(%{[
        {
          "id": "one",
          "uri": "test.feature",
          "keyword": "Feature",
          "name": "One",
          "description": "",
          "line" : 3
        }
      ]})
    end

    it "should parse feature with tags and one scenario" do
      check_json(%{[
        {
          "id": "one",
          "uri": "test.feature",
          "tags": [
            {
              "name": "@foo",
              "line": 22
            }
          ],
          "keyword": "Feature",
          "name": "One",
          "description": "",
          "line": 3,
          "elements": [
            {
              "id": "one/two",
              "type": "scenario",
              "steps": [
                {
                  "name": "Hello",
                  "rows": [
                    {
                      "cells": ["foo", "bar"]
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]})
    end

    it "should parse feature with match, result and embedding" do
      check_json(%{
          [
              {
                  "id":"one",
                  "uri":"test.feature",
                  "tags":[
                      {
                          "name":"@foo",
                          "line":22
                      }
                  ],
                  "keyword":"Feature",
                  "name":"One",
                  "description":"",
                  "line":3,
                  "elements":[
                      {
                          "id":"one/a-scenario",
                          "type":"scenario",
                          "steps":[
                              {
                                  "keyword":"Given ",
                                  "name":"a passing step",
                                  "line":6,
                                  "match":{
                                      "arguments":[
                                          {
                                              "offset":22,
                                              "val":"cukes"
                                          }
                                      ],
                                      "location":"features/step_definitions/steps.rb:1"
                                  },
                                  "result":{
                                      "status":"failed",
                                      "error_message":"You suck",
                                      "duration":-1
                                  },
                                  "embeddings":[
                                      {
                                          "mime_type":"text/plain",
                                          "data":"Tm8sIEknbSBub3QgaW50ZXJlc3RlZCBpbiBkZXZlbG9waW5nIGEgcG93ZXJmdWwgYnJhaW4uIEFsbCBJJ20gYWZ0ZXIgaXMganVzdCBhIG1lZGlvY3JlIGJyYWluLCBzb21ldGhpbmcgbGlrZSB0aGUgUHJlc2lkZW50IG9mIHRoZSBBbWVyaWNhbiBUZWxlcGhvbmUgYW5kIFRlbGVncmFwaCBDb21wYW55Lg=="
                                      }
                                  ],
                                  "output":[
                                      "Hello",
                                      "World"
                                  ]
                              }
                          ],
                          "after": [
                              {
                                  "match":{
                                      "location":"features/step_definitions/hooks.rb:1"
                                  },
                                  "result":{
                                      "status":"passed",
                                      "error_message":"Passed after",
                                      "duration": 3
                                  }
                              },
                              {
                                  "match":{
                                      "location":"features/step_definitions/hooks.rb:3"
                                  },
                                  "result":{
                                      "status":"failed",
                                      "error_message":"Failed After",
                                      "duration": 22
                                  }
                              }
                          ]
                      }
                  ]
              }
          ]
      })
    end

    it "shoud parse a complex feature" do
      check_json('[' + fixture("complex.json") + ']')
    end
  end
end
