mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
tests: added verify test to check miss of controlled filter in equip abilities (related to #11473);
This commit is contained in:
parent
a4c90d9b71
commit
3a92d67d10
9 changed files with 68 additions and 9 deletions
|
|
@ -28,7 +28,10 @@ import mage.choices.Choice;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Rarity;
|
import mage.constants.Rarity;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
|
import mage.constants.TargetController;
|
||||||
import mage.filter.Filter;
|
import mage.filter.Filter;
|
||||||
|
import mage.filter.predicate.Predicate;
|
||||||
|
import mage.filter.predicate.Predicates;
|
||||||
import mage.game.command.Dungeon;
|
import mage.game.command.Dungeon;
|
||||||
import mage.game.command.Plane;
|
import mage.game.command.Plane;
|
||||||
import mage.game.draft.DraftCube;
|
import mage.game.draft.DraftCube;
|
||||||
|
|
@ -2064,6 +2067,25 @@ public class VerifyCardDataTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// special check: equip abilities must have controlled predicate due rules
|
||||||
|
List<EquipAbility> equipAbilities = card.getAbilities()
|
||||||
|
.stream()
|
||||||
|
.filter(a -> a instanceof EquipAbility)
|
||||||
|
.map(a -> (EquipAbility) a)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
equipAbilities.forEach(a -> {
|
||||||
|
List<Predicate> allPredicates = new ArrayList<>();
|
||||||
|
a.getTargets().forEach(t -> Predicates.collectAllComponents(t.getFilter().getPredicates(), t.getFilter().getExtraPredicates(), allPredicates));
|
||||||
|
boolean hasControlledFilter = allPredicates
|
||||||
|
.stream()
|
||||||
|
.filter(p -> p instanceof TargetController.ControllerPredicate)
|
||||||
|
.map(p -> ((TargetController.ControllerPredicate) p).getController())
|
||||||
|
.anyMatch(tc -> tc.equals(TargetController.YOU));
|
||||||
|
if (!hasControlledFilter) {
|
||||||
|
fail(card, "abilities", "card has equip ability, but it doesn't use controllered filter - " + a.getRule());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// spells have only 1 ability
|
// spells have only 1 ability
|
||||||
if (card.isInstantOrSorcery()) {
|
if (card.isInstantOrSorcery()) {
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -452,7 +452,7 @@ public abstract class ContinuousEffectImpl extends EffectImpl implements Continu
|
||||||
// wait dependency
|
// wait dependency
|
||||||
// extraPredicates from some filters is player related, you don't need it here
|
// extraPredicates from some filters is player related, you don't need it here
|
||||||
List<Predicate> list = new ArrayList<>();
|
List<Predicate> list = new ArrayList<>();
|
||||||
Predicates.collectAllComponents(filter.getPredicates(), list);
|
Predicates.collectAllComponents(filter.getPredicates(), filter.getExtraPredicates(), list);
|
||||||
if (list.stream().anyMatch(SubType.SubTypePredicate.class::isInstance)) {
|
if (list.stream().anyMatch(SubType.SubTypePredicate.class::isInstance)) {
|
||||||
this.addDependedToType(DependencyType.AddingCreatureType);
|
this.addDependedToType(DependencyType.AddingCreatureType);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,14 @@ public enum TargetController {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "TargetController(" + controller.toString() + ')';
|
return "TargetController (" + controller.toString() + ')';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For tests
|
||||||
|
*/
|
||||||
|
public TargetController getController() {
|
||||||
|
return this.controller;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ import mage.game.Game;
|
||||||
import mage.util.Copyable;
|
import mage.util.Copyable;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -35,4 +36,8 @@ public interface Filter<E> extends Serializable, Copyable<Filter<E>> {
|
||||||
public void setLockedFilter(boolean lockedFilter);
|
public void setLockedFilter(boolean lockedFilter);
|
||||||
|
|
||||||
List<Predicate<? super E>> getPredicates();
|
List<Predicate<? super E>> getPredicates();
|
||||||
|
|
||||||
|
default List<Predicate> getExtraPredicates() {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -91,12 +91,17 @@ public class FilterCard extends FilterObject<Card> {
|
||||||
return new FilterCard(this);
|
return new FilterCard(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Predicate> getExtraPredicates() {
|
||||||
|
return new ArrayList<>(extraPredicates);
|
||||||
|
}
|
||||||
|
|
||||||
public static void checkPredicateIsSuitableForCardFilter(Predicate predicate) {
|
public static void checkPredicateIsSuitableForCardFilter(Predicate predicate) {
|
||||||
// card filter can't contain controller predicate (only permanents on battlefield have controller)
|
// card filter can't contain controller predicate (only permanents on battlefield have controller)
|
||||||
List<Predicate> list = new ArrayList<>();
|
List<Predicate> list = new ArrayList<>();
|
||||||
Predicates.collectAllComponents(predicate, list);
|
Predicates.collectAllComponents(predicate, list);
|
||||||
if (list.stream().anyMatch(TargetController.ControllerPredicate.class::isInstance)) {
|
if (list.stream().anyMatch(TargetController.ControllerPredicate.class::isInstance)) {
|
||||||
throw new IllegalArgumentException("Card filter doesn't support controller predicate");
|
throw new IllegalArgumentException("Wrong code usage: card filter doesn't support controller predicate");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import mage.abilities.Ability;
|
||||||
import mage.constants.SubType;
|
import mage.constants.SubType;
|
||||||
import mage.filter.predicate.ObjectSourcePlayer;
|
import mage.filter.predicate.ObjectSourcePlayer;
|
||||||
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
||||||
|
import mage.filter.predicate.Predicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.permanent.Permanent;
|
import mage.game.permanent.Permanent;
|
||||||
|
|
||||||
|
|
@ -11,6 +12,7 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author North
|
* @author North
|
||||||
|
|
@ -69,4 +71,9 @@ public class FilterPermanent extends FilterObject<Permanent> implements FilterIn
|
||||||
public FilterPermanent copy() {
|
public FilterPermanent copy() {
|
||||||
return new FilterPermanent(this);
|
return new FilterPermanent(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Predicate> getExtraPredicates() {
|
||||||
|
return new ArrayList<>(extraPredicates);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package mage.filter;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.filter.predicate.ObjectSourcePlayer;
|
import mage.filter.predicate.ObjectSourcePlayer;
|
||||||
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
||||||
|
import mage.filter.predicate.Predicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
|
|
||||||
|
|
@ -56,4 +57,9 @@ public class FilterPlayer extends FilterImpl<Player> {
|
||||||
public FilterPlayer copy() {
|
public FilterPlayer copy() {
|
||||||
return new FilterPlayer(this);
|
return new FilterPlayer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Predicate> getExtraPredicates() {
|
||||||
|
return new ArrayList<>(extraPredicates);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package mage.filter;
|
||||||
import mage.abilities.Ability;
|
import mage.abilities.Ability;
|
||||||
import mage.filter.predicate.ObjectSourcePlayer;
|
import mage.filter.predicate.ObjectSourcePlayer;
|
||||||
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
||||||
|
import mage.filter.predicate.Predicate;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.stack.StackObject;
|
import mage.game.stack.StackObject;
|
||||||
|
|
||||||
|
|
@ -49,4 +50,9 @@ public class FilterStackObject extends FilterObject<StackObject> {
|
||||||
public FilterStackObject copy() {
|
public FilterStackObject copy() {
|
||||||
return new FilterStackObject(this);
|
return new FilterStackObject(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Predicate> getExtraPredicates() {
|
||||||
|
return new ArrayList<>(extraPredicates);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -232,17 +232,18 @@ public final class Predicates {
|
||||||
if (predicate instanceof NotPredicate) {
|
if (predicate instanceof NotPredicate) {
|
||||||
collectAllComponents(((NotPredicate) predicate).predicate, res);
|
collectAllComponents(((NotPredicate) predicate).predicate, res);
|
||||||
} else if (predicate instanceof AndPredicate) {
|
} else if (predicate instanceof AndPredicate) {
|
||||||
collectAllComponents(((AndPredicate) predicate).components, res);
|
collectAllComponents(((AndPredicate) predicate).components, null, res);
|
||||||
} else if (predicate instanceof OrPredicate) {
|
} else if (predicate instanceof OrPredicate) {
|
||||||
collectAllComponents(((OrPredicate) predicate).components, res);
|
collectAllComponents(((OrPredicate) predicate).components, null, res);
|
||||||
} else {
|
} else {
|
||||||
res.add(predicate);
|
res.add(predicate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void collectAllComponents(List<Predicate> predicates, List<Predicate> res) {
|
public static void collectAllComponents(List<Predicate> predicates, List<Predicate> extraPredicates, List<Predicate> res) {
|
||||||
predicates.forEach(p -> {
|
predicates.forEach(p -> collectAllComponents(p, res));
|
||||||
collectAllComponents(p, res);
|
if (extraPredicates != null) {
|
||||||
});
|
extraPredicates.forEach(p -> collectAllComponents(p, res));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue