gremlins icon indicating copy to clipboard operation
gremlins copied to clipboard

[bug] Mutation conditionals-negation only works partially with conditionals-boundary disabled

Open hknutzen opened this issue 1 year ago • 5 comments

🐞Bug Report

Bug Description

The mutation conditionals-negation is only applied to "==" and "!=" but not to ">", "<=", "<", ">=" if mutation conditionals-boundary is disabled.

To Reproduce

Steps to reproduce the behavior:

With this example code

package f

import "fmt"

func f(a, b int) string {
	return fmt.Sprintf("%v %v %v %v %v %v",
		a == b,
		a != b,
		a < b,
		a <= b,
		a > b,
		a >= b,
	)
}

run gremlins run --dry-run --conditionals_boundary=false --workers 1 Output is

 NOT COVERED CONDITIONALS_NEGATION at f.go:7:5
 NOT COVERED CONDITIONALS_NEGATION at f.go:8:5

But with gremlins run --dry-run --workers 1 we get

 NOT COVERED CONDITIONALS_NEGATION at f.go:7:5
 NOT COVERED CONDITIONALS_NEGATION at f.go:8:5
 NOT COVERED CONDITIONALS_BOUNDARY at f.go:9:5
 NOT COVERED CONDITIONALS_NEGATION at f.go:9:5
 NOT COVERED CONDITIONALS_BOUNDARY at f.go:10:5
 NOT COVERED CONDITIONALS_NEGATION at f.go:10:5
 NOT COVERED CONDITIONALS_BOUNDARY at f.go:11:5
 NOT COVERED CONDITIONALS_NEGATION at f.go:11:5
 NOT COVERED CONDITIONALS_BOUNDARY at f.go:12:5
 NOT COVERED CONDITIONALS_NEGATION at f.go:12:5

Found behaviour

Only two from six mutations of conditionals-negation are applied.

Expected behaviour

All six mutations should be applied, even if mutation conditionals-boundary is disabled.

Operating System

hknutzen avatar Jan 21 '24 20:01 hknutzen

I found this bug, when comparing mutation testing results of Gremlins and Ooze. Mutation "conditionals-negation" of Gremlins is equivalent to "comparisoninvert" of Ooze.

hknutzen avatar Jan 21 '24 20:01 hknutzen

Hi! I don't understand why different behaviour expected.

That's different mutators. One for ==, != other for >, <, =>, <=

https://gremlins.dev/latest/usage/mutations/conditionals_boundary/ https://gremlins.dev/latest/usage/mutations/conditionals_negation/

Conditionals negation inverts the conditional direction, which means a == will become a !=

I guess it's just a bug in documentation page and can be easily fixed in md. What do you think?

rusinikita avatar Feb 14 '24 06:02 rusinikita

The term a > b is mutated to

  1. a >= b by conditionals boundary
  2. a <= b by conditionals negation

The bug is, that the 2. mutation is only applied if both mutators are activated.

My example shows that both mutators are applicable to a > b:

 NOT COVERED CONDITIONALS_BOUNDARY at f.go:11:5
 NOT COVERED CONDITIONALS_NEGATION at f.go:11:5

hknutzen avatar Feb 14 '24 19:02 hknutzen

Yep! Got it. I'll find a fix

rusinikita avatar Feb 15 '24 05:02 rusinikita

Here should be continue instead of return.

https://github.com/go-gremlins/gremlins/blob/main/internal/engine/engine.go#L142

Because of that, it checks for CONDITIONALS_BOUNDARY and returns. So, it do not checks for CONDITIONALS_NEGATION.

Do you want to make PR?

rusinikita avatar Feb 15 '24 05:02 rusinikita