github.com/getgauge/gauge@v1.6.9/refactor/refactor_test.go (about)

     1  /*----------------------------------------------------------------
     2   *  Copyright (c) ThoughtWorks, Inc.
     3   *  Licensed under the Apache License, Version 2.0
     4   *  See LICENSE in the project root for license information.
     5   *----------------------------------------------------------------*/
     6  
     7  package refactor
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/getgauge/gauge-proto/go/gauge_messages"
    13  
    14  	"github.com/getgauge/gauge/gauge"
    15  	"github.com/getgauge/gauge/parser"
    16  	. "gopkg.in/check.v1"
    17  )
    18  
    19  func Test(t *testing.T) { TestingT(t) }
    20  
    21  type MySuite struct{}
    22  
    23  var _ = Suite(&MySuite{})
    24  
    25  func (s *MySuite) TestRefactoringOfStepsWithNoArgs(c *C) {
    26  	oldStep := "first step"
    27  	newStep := "second step"
    28  	tokens := []*parser.Token{
    29  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
    30  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading", LineNo: 2},
    31  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3},
    32  	}
    33  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
    34  	agent, errs := getRefactorAgent(oldStep, newStep, nil)
    35  	specs := append(make([]*gauge.Specification, 0), spec)
    36  	agent.rephraseInSpecsAndConcepts(&specs, gauge.NewConceptDictionary())
    37  
    38  	c.Assert(len(errs), Equals, 0)
    39  	c.Assert(len(specs[0].Scenarios[0].Steps), Equals, 1)
    40  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, newStep)
    41  }
    42  
    43  func (s *MySuite) TestRefactoringOfStepsWithNoArgsAndWithMoreThanOneScenario(c *C) {
    44  	oldStep := "first step"
    45  	newStep := "second step"
    46  	unchanged := "unchanged"
    47  	tokens := []*parser.Token{
    48  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
    49  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading", LineNo: 2},
    50  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3},
    51  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 5},
    52  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 20},
    53  		&parser.Token{Kind: gauge.StepKind, Value: unchanged, LineNo: 30},
    54  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 50},
    55  	}
    56  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
    57  	agent, errs := getRefactorAgent(oldStep, newStep, nil)
    58  	specs := append(make([]*gauge.Specification, 0), spec)
    59  	agent.rephraseInSpecsAndConcepts(&specs, gauge.NewConceptDictionary())
    60  
    61  	c.Assert(len(errs), Equals, 0)
    62  	c.Assert(len(specs[0].Scenarios), Equals, 2)
    63  	c.Assert(len(specs[0].Scenarios[0].Steps), Equals, 2)
    64  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, newStep)
    65  	c.Assert(specs[0].Scenarios[0].Steps[1].Value, Equals, newStep)
    66  
    67  	c.Assert(len(specs[0].Scenarios[1].Steps), Equals, 2)
    68  	c.Assert(specs[0].Scenarios[1].Steps[0].Value, Equals, unchanged)
    69  	c.Assert(specs[0].Scenarios[1].Steps[1].Value, Equals, newStep)
    70  }
    71  
    72  func (s *MySuite) TestRefactoringOfStepsWithNoArgsAndWithMoreThanOneSpec(c *C) {
    73  	oldStep := " first step"
    74  	newStep := "second step"
    75  	tokens := []*parser.Token{
    76  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
    77  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading", LineNo: 2},
    78  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3},
    79  	}
    80  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
    81  	tokens = []*parser.Token{
    82  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 10},
    83  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading", LineNo: 20},
    84  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 30},
    85  	}
    86  	spec1, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
    87  	specs := append(make([]*gauge.Specification, 0), spec)
    88  	specs = append(specs, spec1)
    89  	agent, errs := getRefactorAgent(oldStep, newStep, nil)
    90  	specRefactored, _ := agent.rephraseInSpecsAndConcepts(&specs, gauge.NewConceptDictionary())
    91  
    92  	for _, diffs := range specRefactored {
    93  		c.Assert(1, Equals, len(diffs))
    94  	}
    95  	c.Assert(len(errs), Equals, 0)
    96  	c.Assert(len(specs[0].Scenarios[0].Steps), Equals, 1)
    97  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, newStep)
    98  
    99  	c.Assert(len(specs[1].Scenarios[0].Steps), Equals, 1)
   100  	c.Assert(specs[1].Scenarios[0].Steps[0].Value, Equals, newStep)
   101  }
   102  
   103  func (s *MySuite) TestRefactoringOfStepsWithNoArgsInConceptFiles(c *C) {
   104  	oldStep := "first step"
   105  	newStep := "second step"
   106  	unchanged := "unchanged"
   107  	tokens := []*parser.Token{
   108  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   109  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 20},
   110  	}
   111  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   112  	agent, _ := getRefactorAgent(oldStep, newStep, nil)
   113  	specs := append(make([]*gauge.Specification, 0), spec)
   114  	dictionary := gauge.NewConceptDictionary()
   115  	step1 := &gauge.Step{Value: oldStep + "sdsf", IsConcept: true}
   116  	step2 := &gauge.Step{Value: unchanged, IsConcept: true, Items: []gauge.Item{&gauge.Step{Value: oldStep, IsConcept: false}, &gauge.Step{Value: oldStep + "T", IsConcept: false}}}
   117  
   118  	dictionary.ConceptsMap[step1.Value] = &gauge.Concept{ConceptStep: step1, FileName: "file.cpt"}
   119  	dictionary.ConceptsMap[step2.Value] = &gauge.Concept{ConceptStep: step2, FileName: "file.cpt"}
   120  
   121  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   122  
   123  	c.Assert(dictionary.ConceptsMap[unchanged].ConceptStep.Items[0].(*gauge.Step).Value, Equals, newStep)
   124  	c.Assert(dictionary.ConceptsMap[unchanged].ConceptStep.Items[1].(*gauge.Step).Value, Equals, oldStep+"T")
   125  }
   126  
   127  func (s *MySuite) TestRefactoringGivesOnlySpecsThatAreRefactored(c *C) {
   128  	oldStep := " first step"
   129  	newStep := "second step"
   130  	tokens := []*parser.Token{
   131  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   132  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading", LineNo: 2},
   133  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3},
   134  	}
   135  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   136  	tokens = []*parser.Token{
   137  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 10},
   138  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading", LineNo: 20},
   139  		&parser.Token{Kind: gauge.StepKind, Value: newStep, LineNo: 30},
   140  	}
   141  	spec1, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   142  	specs := append(make([]*gauge.Specification, 0), spec)
   143  	specs = append(specs, spec1)
   144  	agent, _ := getRefactorAgent(oldStep, newStep, nil)
   145  	specRefactored, _ := agent.rephraseInSpecsAndConcepts(&specs, gauge.NewConceptDictionary())
   146  
   147  	c.Assert(1, Equals, len(specRefactored[specs[0]]))
   148  	c.Assert(0, Equals, len(specRefactored[specs[1]]))
   149  	c.Assert(specRefactored[specs[0]][0].OldStep.Value, Equals, " first step")
   150  	c.Assert(specRefactored[specs[0]][0].NewStep.Value, Equals, "second step")
   151  }
   152  
   153  func (s *MySuite) TestRefactoringGivesOnlyThoseConceptFilesWhichAreRefactored(c *C) {
   154  	oldStep := "first step"
   155  	newStep := "second step"
   156  	unchanged := "unchanged"
   157  	tokens := []*parser.Token{
   158  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   159  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 20},
   160  	}
   161  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   162  	agent, _ := getRefactorAgent(oldStep, newStep, nil)
   163  	specs := append(make([]*gauge.Specification, 0), spec)
   164  	dictionary := gauge.NewConceptDictionary()
   165  	step1 := &gauge.Step{Value: oldStep + "sdsf", IsConcept: true}
   166  	step2 := &gauge.Step{Value: unchanged, IsConcept: true, Items: []gauge.Item{&gauge.Step{Value: newStep, IsConcept: false}, &gauge.Step{Value: oldStep + "T", IsConcept: false}}}
   167  	step3 := &gauge.Step{Value: "Concept value", IsConcept: true, Items: []gauge.Item{&gauge.Step{Value: oldStep, IsConcept: false}, &gauge.Step{Value: oldStep + "T", IsConcept: false}}}
   168  	fileName := "file.cpt"
   169  	dictionary.ConceptsMap[step1.Value] = &gauge.Concept{ConceptStep: step1, FileName: fileName}
   170  	dictionary.ConceptsMap[step2.Value] = &gauge.Concept{ConceptStep: step2, FileName: fileName}
   171  	dictionary.ConceptsMap[step3.Value] = &gauge.Concept{ConceptStep: step3, FileName: "e" + fileName}
   172  
   173  	_, filesRefactored := agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   174  
   175  	c.Assert(len(filesRefactored[fileName]), Equals, 0)
   176  	c.Assert(len(filesRefactored["e"+fileName]), Equals, 1)
   177  }
   178  
   179  func (s *MySuite) TestRenamingWhenNumberOfArgumentsAreSame(c *C) {
   180  	oldStep := "first step {static} and {static}"
   181  	oldStep1 := "first step <a> and <b>"
   182  	newStep := "second step <a> and <b>"
   183  	tokens := []*parser.Token{
   184  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   185  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   186  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address"}},
   187  	}
   188  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   189  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   190  	specs := append(make([]*gauge.Specification, 0), spec)
   191  	dictionary := gauge.NewConceptDictionary()
   192  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   193  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, "second step {} and {}")
   194  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[0].Value, Equals, "name")
   195  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[1].Value, Equals, "address")
   196  }
   197  
   198  func (s *MySuite) TestRenamingWhenArgumentsOrderIsChanged(c *C) {
   199  	oldStep := "first step {static} and {static} and {static} and {static}"
   200  	oldStep1 := "first step <a> and <b> and <c> and <d>"
   201  	newStep := "second step <d> and <b> and <c> and <a>"
   202  	tokens := []*parser.Token{
   203  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   204  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   205  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   206  	}
   207  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   208  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   209  	specs := append(make([]*gauge.Specification, 0), spec)
   210  	dictionary := gauge.NewConceptDictionary()
   211  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   212  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, "second step {} and {} and {} and {}")
   213  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[0].Value, Equals, "id")
   214  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[1].Value, Equals, "address")
   215  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[2].Value, Equals, "number")
   216  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[3].Value, Equals, "name")
   217  }
   218  
   219  func (s *MySuite) TestCreateOrderGivesMapOfOldArgsAndNewArgs(c *C) {
   220  	step1 := &gauge.Step{Args: []*gauge.StepArg{&gauge.StepArg{Name: "a"}, &gauge.StepArg{Name: "b"}, &gauge.StepArg{Name: "c"}, &gauge.StepArg{Name: "d"}}}
   221  	step2 := &gauge.Step{Args: []*gauge.StepArg{&gauge.StepArg{Name: "d"}, &gauge.StepArg{Name: "b"}, &gauge.StepArg{Name: "c"}, &gauge.StepArg{Name: "a"}}}
   222  
   223  	agent := &rephraseRefactorer{step1, step2, false, nil}
   224  	orderMap := agent.createOrderOfArgs()
   225  
   226  	c.Assert(orderMap[0], Equals, 3)
   227  	c.Assert(orderMap[1], Equals, 1)
   228  	c.Assert(orderMap[2], Equals, 2)
   229  }
   230  
   231  func (s *MySuite) TestCreateOrderGivesMapOfOldArgsAndNewWhenArgsAreAdded(c *C) {
   232  	step1 := &gauge.Step{Args: []*gauge.StepArg{&gauge.StepArg{Name: "a"}, &gauge.StepArg{Name: "b"}, &gauge.StepArg{Name: "c"}, &gauge.StepArg{Name: "d"}}}
   233  	step2 := &gauge.Step{Args: []*gauge.StepArg{&gauge.StepArg{Name: "d"}, &gauge.StepArg{Name: "e"}, &gauge.StepArg{Name: "b"}, &gauge.StepArg{Name: "c"}, &gauge.StepArg{Name: "a"}}}
   234  
   235  	agent := &rephraseRefactorer{step1, step2, false, nil}
   236  	orderMap := agent.createOrderOfArgs()
   237  
   238  	c.Assert(orderMap[0], Equals, 3)
   239  	c.Assert(orderMap[1], Equals, -1)
   240  	c.Assert(orderMap[2], Equals, 1)
   241  	c.Assert(orderMap[3], Equals, 2)
   242  	c.Assert(orderMap[4], Equals, 0)
   243  }
   244  
   245  func (s *MySuite) TestCreateOrderGivesMapOfOldArgsAndNewWhenArgsAreRemoved(c *C) {
   246  	step1 := &gauge.Step{Args: []*gauge.StepArg{&gauge.StepArg{Name: "a"}, &gauge.StepArg{Name: "b"}, &gauge.StepArg{Name: "c"}, &gauge.StepArg{Name: "d"}}}
   247  	step2 := &gauge.Step{Args: []*gauge.StepArg{&gauge.StepArg{Name: "d"}, &gauge.StepArg{Name: "b"}, &gauge.StepArg{Name: "c"}}}
   248  
   249  	agent := &rephraseRefactorer{step1, step2, false, nil}
   250  	orderMap := agent.createOrderOfArgs()
   251  
   252  	c.Assert(orderMap[0], Equals, 3)
   253  	c.Assert(orderMap[1], Equals, 1)
   254  	c.Assert(orderMap[2], Equals, 2)
   255  }
   256  
   257  func (s *MySuite) TestCreationOfOrderMapForStep(c *C) {
   258  	agent, _ := getRefactorAgent("Say <greeting> to <name>", "Say <greeting> to <name> \"DD\"", nil)
   259  
   260  	orderMap := agent.createOrderOfArgs()
   261  
   262  	c.Assert(orderMap[0], Equals, 0)
   263  	c.Assert(orderMap[1], Equals, 1)
   264  	c.Assert(orderMap[2], Equals, -1)
   265  }
   266  
   267  func (s *MySuite) TestRenamingWhenArgumentsIsAddedAtLast(c *C) {
   268  	oldStep := "first step {static} and {static} and {static}"
   269  	oldStep1 := "first step <a> and <b> and <c>"
   270  	newStep := "second step <a> and <b> and <c> and <d>"
   271  	tokens := []*parser.Token{
   272  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   273  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   274  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number"}},
   275  	}
   276  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   277  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   278  	specs := append(make([]*gauge.Specification, 0), spec)
   279  	dictionary := gauge.NewConceptDictionary()
   280  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   281  
   282  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, "second step {} and {} and {} and {}")
   283  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[0].Value, Equals, "name")
   284  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[1].Value, Equals, "address")
   285  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[2].Value, Equals, "number")
   286  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[3].Value, Equals, "d")
   287  }
   288  
   289  func (s *MySuite) TestRenamingWhenArgumentsIsAddedAtFirst(c *C) {
   290  	oldStep := "first step {static} and {static} and {static}"
   291  	oldStep1 := "first step <a> and <b> and <c>"
   292  	newStep := "second step <d> and <a> and <b> and <c>"
   293  	tokens := []*parser.Token{
   294  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   295  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   296  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number"}},
   297  	}
   298  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   299  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   300  	specs := append(make([]*gauge.Specification, 0), spec)
   301  	dictionary := gauge.NewConceptDictionary()
   302  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   303  
   304  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, "second step {} and {} and {} and {}")
   305  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[0].Value, Equals, "d")
   306  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[1].Value, Equals, "name")
   307  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[2].Value, Equals, "address")
   308  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[3].Value, Equals, "number")
   309  }
   310  
   311  func (s *MySuite) TestRenamingWhenArgumentsIsAddedInMiddle(c *C) {
   312  	oldStep := "first step {static} and {static} and {static}"
   313  	oldStep1 := "first step <a> and <b> and <c>"
   314  	newStep := "second step <a> and <d> and <b> and <c>"
   315  	tokens := []*parser.Token{
   316  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   317  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   318  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number"}},
   319  	}
   320  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   321  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   322  	specs := append(make([]*gauge.Specification, 0), spec)
   323  	dictionary := gauge.NewConceptDictionary()
   324  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   325  
   326  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, "second step {} and {} and {} and {}")
   327  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[0].Value, Equals, "name")
   328  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[1].Value, Equals, "d")
   329  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[2].Value, Equals, "address")
   330  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[3].Value, Equals, "number")
   331  }
   332  
   333  func (s *MySuite) TestRenamingWhenArgumentsIsRemovedFromLast(c *C) {
   334  	oldStep := "first step {static} and {static} and {static} and {static}"
   335  	oldStep1 := "first step <a> and <b> and <c> and <d>"
   336  	newStep := "second step <a> and <b> and <c>"
   337  	tokens := []*parser.Token{
   338  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   339  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   340  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   341  	}
   342  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   343  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   344  	specs := append(make([]*gauge.Specification, 0), spec)
   345  	dictionary := gauge.NewConceptDictionary()
   346  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   347  
   348  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, "second step {} and {} and {}")
   349  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[0].Value, Equals, "name")
   350  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[1].Value, Equals, "address")
   351  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[2].Value, Equals, "number")
   352  }
   353  
   354  func (s *MySuite) TestRenamingWhenArgumentsIsRemovedFromBegining(c *C) {
   355  	oldStep := "first step {static} and {static} and {static} and {static}"
   356  	oldStep1 := "first step <a> and <b> and <c> and <d>"
   357  	newStep := "second step <b> and <c> and <d>"
   358  	tokens := []*parser.Token{
   359  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   360  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   361  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   362  	}
   363  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   364  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   365  	specs := append(make([]*gauge.Specification, 0), spec)
   366  	dictionary := gauge.NewConceptDictionary()
   367  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   368  
   369  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, "second step {} and {} and {}")
   370  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[0].Value, Equals, "address")
   371  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[1].Value, Equals, "number")
   372  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[2].Value, Equals, "id")
   373  }
   374  
   375  func (s *MySuite) TestRenamingWhenArgumentsIsRemovedFromMiddle(c *C) {
   376  	oldStep := "first step {static} and {static} and {static} and {static}"
   377  	oldStep1 := "first step <a> and <b> and <c> and <d>"
   378  	newStep := "second step <a> and <b> and <d>"
   379  	tokens := []*parser.Token{
   380  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   381  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   382  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   383  	}
   384  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   385  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   386  	specs := append(make([]*gauge.Specification, 0), spec)
   387  	dictionary := gauge.NewConceptDictionary()
   388  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   389  
   390  	c.Assert(specs[0].Scenarios[0].Steps[0].Value, Equals, "second step {} and {} and {}")
   391  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[0].Value, Equals, "name")
   392  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[1].Value, Equals, "address")
   393  	c.Assert(specs[0].Scenarios[0].Steps[0].Args[2].Value, Equals, "id")
   394  }
   395  
   396  func (s *MySuite) TestGenerateNewStepNameGivesLineTextWithActualParamNames(c *C) {
   397  	args := []string{"name", "address", "id"}
   398  	newStep := "second step <a> and <b> and <d>"
   399  	orderMap := make(map[int]int)
   400  	orderMap[0] = 1
   401  	orderMap[1] = 2
   402  	orderMap[2] = 0
   403  	agent, _ := getRefactorAgent(newStep, newStep, nil)
   404  	linetext := agent.generateNewStepName(args, orderMap)
   405  
   406  	c.Assert(linetext, Equals, "second step <address> and <id> and <name>")
   407  }
   408  
   409  func (s *MySuite) TestGenerateNewStepNameWhenParametersAreAdded(c *C) {
   410  	args := []string{"name", "address"}
   411  	newStep := "changed step <a> and <b> and \"id\""
   412  	orderMap := make(map[int]int)
   413  	orderMap[0] = 1
   414  	orderMap[1] = 0
   415  	orderMap[2] = -1
   416  	agent, _ := getRefactorAgent(newStep, newStep, nil)
   417  	linetext := agent.generateNewStepName(args, orderMap)
   418  
   419  	c.Assert(linetext, Equals, "changed step <address> and <name> and \"id\"")
   420  }
   421  
   422  func (s *MySuite) TestGenerateNewStepNameWhenParametersAreRemoved(c *C) {
   423  	args := []string{"name", "address", "desc"}
   424  	newStep := "changed step <b> and \"id\""
   425  	orderMap := make(map[int]int)
   426  	orderMap[0] = 1
   427  	orderMap[1] = -1
   428  	orderMap[2] = -1
   429  	agent, _ := getRefactorAgent(newStep, newStep, nil)
   430  	linetext := agent.generateNewStepName(args, orderMap)
   431  
   432  	c.Assert(linetext, Equals, "changed step <address> and \"id\"")
   433  }
   434  
   435  func (s *MySuite) TestGenerateNewStepNameWhenParametersAreUnchanged(c *C) {
   436  	args := []string{"a"}
   437  	newStep := "make comment <a>"
   438  	agent, _ := getRefactorAgent("Comment <a>", newStep, nil)
   439  	linetext := agent.generateNewStepName(args, agent.createOrderOfArgs())
   440  
   441  	c.Assert(linetext, Equals, "make comment <a>")
   442  }
   443  
   444  func (s *MySuite) TestRefactoringInContextStep(c *C) {
   445  	oldStep := "first step {static} and {static} and {static} and {static}"
   446  	oldStep1 := "first step <a> and <b> and <c> and <d>"
   447  	newStep := "second step <d> and <b> and <c> and <a>"
   448  	tokens := []*parser.Token{
   449  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   450  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   451  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   452  		&parser.Token{Kind: gauge.StepKind, Value: oldStep + " sdf", LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   453  	}
   454  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   455  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   456  	specs := append(make([]*gauge.Specification, 0), spec)
   457  	dictionary := gauge.NewConceptDictionary()
   458  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   459  	c.Assert(specs[0].Contexts[0].Value, Equals, "second step {} and {} and {} and {}")
   460  	c.Assert(specs[0].Contexts[0].Args[0].Value, Equals, "id")
   461  	c.Assert(specs[0].Contexts[0].Args[1].Value, Equals, "address")
   462  	c.Assert(specs[0].Contexts[0].Args[2].Value, Equals, "number")
   463  	c.Assert(specs[0].Contexts[0].Args[3].Value, Equals, "name")
   464  }
   465  
   466  func (s *MySuite) TestRefactoringInTearDownStep(c *C) {
   467  	oldStep := "first step {static} and {static} and {static} and {static}"
   468  	oldStep1 := "first step <a> and <b> and <c> and <d>"
   469  	newStep := "second step <d> and <b> and <c> and <a>"
   470  	tokens := []*parser.Token{
   471  		&parser.Token{Kind: gauge.SpecKind, Value: "Spec Heading", LineNo: 1},
   472  		&parser.Token{Kind: gauge.StepKind, Value: oldStep + "sdf", LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   473  		&parser.Token{Kind: gauge.ScenarioKind, Value: "Scenario Heading 1", LineNo: 2},
   474  		&parser.Token{Kind: gauge.StepKind, Value: oldStep + " sdf", LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   475  		&parser.Token{Kind: gauge.TearDownKind, Value: "____", LineNo: 3},
   476  		&parser.Token{Kind: gauge.StepKind, Value: oldStep, LineNo: 3, Args: []string{"name", "address", "number", "id"}},
   477  	}
   478  	spec, _, _ := new(parser.SpecParser).CreateSpecification(tokens, gauge.NewConceptDictionary(), "")
   479  	agent, _ := getRefactorAgent(oldStep1, newStep, nil)
   480  	specs := append(make([]*gauge.Specification, 0), spec)
   481  	dictionary := gauge.NewConceptDictionary()
   482  	agent.rephraseInSpecsAndConcepts(&specs, dictionary)
   483  	c.Assert(specs[0].TearDownSteps[0].Value, Equals, "second step {} and {} and {} and {}")
   484  	c.Assert(specs[0].TearDownSteps[0].Args[0].Value, Equals, "id")
   485  	c.Assert(specs[0].TearDownSteps[0].Args[1].Value, Equals, "address")
   486  	c.Assert(specs[0].TearDownSteps[0].Args[2].Value, Equals, "number")
   487  	c.Assert(specs[0].TearDownSteps[0].Args[3].Value, Equals, "name")
   488  }
   489  
   490  func (s *MySuite) TestRefactoringExternalSteps(c *C) {
   491  	oldStep := "first step"
   492  	newStep := "second step"
   493  	agent, _ := getRefactorAgent(oldStep, newStep, nil)
   494  	r := &mockRunner{
   495  		response: &gauge_messages.Message{
   496  			StepNameResponse: &gauge_messages.StepNameResponse{
   497  				IsExternal:    true,
   498  				IsStepPresent: true,
   499  				HasAlias:      false,
   500  				StepName:      []string{oldStep},
   501  			},
   502  		},
   503  	}
   504  
   505  	stepName, err, _ := agent.getStepNameFromRunner(r)
   506  	c.Assert(err, NotNil)
   507  	c.Assert(err.Error(), Equals, "external step: Cannot refactor 'first step' is in external project or library")
   508  	c.Assert(stepName, Equals, "")
   509  }