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 }