Beispiel #1
0
 def test_BanisherPriest(self):
         #Card name: Banisher Priest
         cardName = MgName("Banisher Priest")
         
         #Mana cost: 1WW.
         s0 = MgManaSymbol(cvalue=1)
         s1 = MgManaSymbol(colorv=MgManaSymbol.ManaType.White)
         s2 = MgManaSymbol(colorv=MgManaSymbol.ManaType.White)
         manaExpr = MgManaExpression(s0,s1,s2)
         
         #Creature - Human Cleric
         t_creature = MgTypeExpression(MgType(MgType.TypeEnum.Creature))
         t_human = MgTypeExpression(MgType(MgType.SubtypeEnum.Human))
         t_cleric = MgTypeExpression(MgType(MgType.SubtypeEnum.Cleric))
         typeLine = MgTypeLine(types=MgTypeLine(t_creature),subtypes=MgTypeLine(t_human,t_cleric))
         
         
         #exile target creature an opponent controls
         exileEffect = MgExileEffectExpression(
                 subject = MgTargetExpression(MgDescriptionExpression(
                         MgTypeExpression(MgType(MgType.TypeEnum.Creature)),
                         MgControlExpression("an opponent")))                        
         )
         
         #[...] until Banisher Priest leaves the battlefield.
         untilCondition = MgUntilExpression(MgEntersLeavesBattlefieldExpression(MgNameReference(),entering=False))
         
         #when Banisher Priest enters the battlefield, [...]
         entersTheBattlefield = MgEntersLeavesBattlefieldExpression(MgNameReference,entering=True)
Beispiel #2
0
 def test_DoomBlade(self):
         
         #Card name: Doom Blade.
         cardName = MgName("Doom Blade")
         
         #Mana cost: 1B.
         s0 = MgManaSymbol(cvalue=1)
         s1 = MgManaSymbol(colorv=MgManaSymbol.ManaType.Black)
         manaExpr = MgManaExpression(s0,s1)
         
         #Instant.
         t_instant = MgTypeExpression(MgType(MgType.TypeEnum.Instant))
         typeLine = MgTypeLine(types=t_instant)
         
         #Destroy target non-black creature.
         c_nonblack = MgColorExpression(MgNonExpression(MgColorTerm(MgColorTerm.ColorTermEnum.Black)))
         t_creature = MgTypeExpression(MgType(MgType.TypeEnum.Creature)) 
         description = MgDescriptionExpression(c_nonblack,t_creature)
         targetExpr = MgTargetExpression(description)
         destroyExpr = MgDestroyExpression(targetExpr)
         instructions = MgStatementSequence(MgStatement(destroyExpr))
         ability = MgSpellAbility(instructions)
         textBox = MgTextBox(ability)
         
         #The card, all put together
         card = MgCard(**{
                 "name" : cardName,
                 "manaCost" : manaExpr,
                 "typeLine" : typeLine,
                 "textBox" : textBox
         })
Beispiel #3
0
    def test_Protection(self):
        #Protection from Red
        red = MgColorExpression(MgColorTerm(MgColorTerm.ColorTermEnum.Red))
        pro_red = MgProtectionAbility(red)

        self.assertTrue(pro_red.isTraversable())
        self.assertEqual(len(pro_red.getTraversalSuccessors()), 1)
        self.assertTrue(pro_red.isChild(red))
        self.assertEqual(red.getParent(), pro_red)
        self.assertEqual(pro_red.unparseToString().lower(),
                         "protection from red")

        #Protection from instant spell[s] and from sorcery spell[s]
        #Note that the default unparsing routine does not do pluralization,
        #though it's expected of a dedicated unparser.

        instant_spells = MgDescriptionExpression(
            MgTypeExpression(MgType(MgType.TypeEnum.Instant)),
            MgQualifier(MgQualifier.QualifierEnum.Spell))

        sorcery_spells = MgDescriptionExpression(
            MgTypeExpression(MgType(MgType.TypeEnum.Sorcery)),
            MgQualifier(MgQualifier.QualifierEnum.Spell))

        pro_instantAndSorcery = MgProtectionAbility(instant_spells,
                                                    sorcery_spells)

        self.assertEqual(len(pro_instantAndSorcery.getTraversalSuccessors()),
                         2)
        self.assertTrue(pro_instantAndSorcery.isChild(instant_spells))
        self.assertEqual(instant_spells.getParent(), pro_instantAndSorcery)
        self.assertEqual(
            pro_instantAndSorcery.unparseToString().lower(),
            "protection from instant spell and from sorcery spell")
 def test_modifiers(self):
         triggered = MgAbilityModifier(MgAbilityModifier.AbilityModifierEnum.Triggered)
         ability = MgQualifier(MgQualifier.QualifierEnum.Ability)
         triggered_ability = MgDescriptionExpression(triggered,ability)
         
         self.assertTrue(triggered.isTraversable())
         self.assertEqual(len(triggered.getTraversalSuccessors()),0)
         self.assertEqual(triggered.getModifier(),MgAbilityModifier.AbilityModifierEnum.Triggered)
         self.assertEqual(triggered_ability.unparseToString().lower(),"triggered ability")
         
         blocking = MgCombatStatusModifier(MgCombatStatusModifier.CombatStatusEnum.Blocking)
         creature = MgTypeExpression(MgType(MgType.TypeEnum.Creature))
         blocking_creature = MgDescriptionExpression(blocking,creature)
         self.assertEqual(blocking_creature.unparseToString().lower(),"blocking creature")
         
         enchanted = MgKeywordStatusModifier(MgKeywordStatusModifier.KeywordStatusEnum.Enchanted)
         permanent = MgQualifier(MgQualifier.QualifierEnum.Permanent)
         enchanted_permanent = MgDescriptionExpression(enchanted,permanent)
         self.assertEqual(enchanted_permanent.unparseToString().lower(),"enchanted permanent")
         
         tapped = MgTapStatusModifier(MgTapStatusModifier.TapStatusEnum.Tapped)
         artifact = MgTypeExpression(MgType(MgType.TypeEnum.Artifact))
         tapped_artifact = MgDescriptionExpression(tapped,artifact)
         self.assertEqual(tapped_artifact.unparseToString().lower(),"tapped artifact")
         
         chosen = MgEffectStatusModifier(MgEffectStatusModifier.EffectStatusEnum.Chosen)
         token = MgQualifier(MgQualifier.QualifierEnum.Token)
         tapped_artifact = MgDescriptionExpression(chosen,token)
         self.assertEqual(tapped_artifact.unparseToString().lower(),"chosen token")
Beispiel #5
0
 def test_TargetExpressions(self):
         t_artifact = MgType(MgType.TypeEnum.Artifact)
         t_creature = MgType(MgType.TypeEnum.Creature)
         typeexpr = MgTypeExpression(t_artifact,t_creature)
         
         targetExpr = MgTargetExpression(typeexpr)
         
         self.assertEqual(targetExpr.unparseToString().lower(),"target artifact creature")
Beispiel #6
0
 def test_CrypticCommand(self):
         #Card name: Cryptic Command
         cardName = MgName("Cryptic Command")
         
         #Mana cost: 1UUU.
         s0 = MgManaSymbol(cvalue=1)
         s1 = MgManaSymbol(colorv=MgManaSymbol.ManaType.Blue)
         s2 = MgManaSymbol(colorv=MgManaSymbol.ManaType.Blue)
         s3 = MgManaSymbol(colorv=MgManaSymbol.ManaType.Blue)
         manaExpr = MgManaExpression(s0,s1,s2,s3)
         
         #Instant.
         t_instant = MgTypeExpression(MgType(MgType.TypeEnum.Instant))
         typeLine = MgTypeLine(types=t_instant)
         
         #counter target spell
         choice_counterspell = MgStatementSequence(MgStatement(MgUncastExpression(MgTargetExpression(MgDescriptionExpression(
                 MgQualifier(MgQualifier.QualifierEnum.Spell)
         )))))
         
         #Return target permanent to its owner's hand.
         choice_bounce = MgStatementSequence(MgStatement(MgReturnExpression(
                 subject = MgTargetExpression(MgDescriptionExpression(MgQualifier(MgQualifier.QualifierEnum.Permanent))),
                 destination = MgPossessiveExpression(possessive=MgPossessiveExpression.PossessiveEnum.Owner,owned=MgZone(MgZone.ZoneEnum.Hand))
         )))
         
         #Tap all creatures your opponents control.
         choice_tap = MgStatementSequence(MgStatement(MgTapUntapExpression(
                 MgAllExpression(MgDescriptionExpression(MgTypeExpression(MgType(MgType.TypeEnum.Creature)),MgControlExpression("your opponents")))
                 ,tap=True
         )))
         
         #Draw a card.
         choice_draw = MgStatementSequence(MgStatement(MgCardDrawExpression(MgNumberValue(value=1,ntype=MgNumberValue.NumberTypeEnum.Quantity))))
         
         #Choose two
         modalExpr = MgModalExpression(
                 MgNumberValue(value=2,ntype=MgNumberValue.NumberTypeEnum.Quantity),
                 choice_counterspell,choice_bounce,choice_tap,choice_draw
         )
         
         instructions = MgStatementSequence(MgStatement(modalExpr,periodTerminated=False))
         ability = MgSpellAbility(instructions)
         textBox = MgTextBox(ability)
         
         card = MgCard(**{
                 "name" : cardName,
                 "manaCost" : manaExpr,
                 "typeLine" : typeLine,
                 "textBox" : textBox
         })
         
         print(card.unparseToString().lower())
         visitor = SimpleGraphingVisitor()
         visitor.traverse(card)
Beispiel #7
0
    def test_Offering(self):
        t_planeswalker = MgTypeExpression(MgType(MgType.TypeEnum.Planeswalker))
        offering = MgOfferingAbility(descriptor=t_planeswalker)
        self.assertTrue(offering.isChild(t_planeswalker))
        self.assertEqual(t_planeswalker.getParent(), offering)
        self.assertEqual(offering.getDescriptor(), t_planeswalker)
        self.assertEqual(len(offering.getTraversalSuccessors()), 1)
        self.assertEqual(offering.unparseToString().lower(),
                         "planeswalker offering")

        t_artifact = MgTypeExpression(MgType(MgType.TypeEnum.Artifact))
        offering.setDescriptor(t_artifact)
        self.assertEqual(offering.getDescriptor(), t_artifact)
        self.assertEqual(offering.unparseToString().lower(),
                         "artifact offering")
    def test_TypeLine(self):
        t_legendary = MgSupertype(MgSupertype.SupertypeEnum.Legendary)
        t_creature = MgType(MgType.TypeEnum.Creature)
        t_human = MgSubtype(MgSubtype.CreatureSubtypeEnum.Human)
        t_cleric = MgSubtype(MgSubtype.CreatureSubtypeEnum.Cleric)

        texpr_supertypes = MgTypeExpression(t_legendary)
        texpr_types = MgTypeExpression(t_creature)
        texpr_subtypes = MgTypeExpression(t_human, t_cleric)

        typeline = MgTypeLine(supertypes=texpr_supertypes,
                              types=texpr_types,
                              subtypes=texpr_subtypes)

        self.assertTrue(typeline.isTraversable())
        self.assertEqual(len(typeline.getTraversalSuccessors()), 3)

        self.assertTrue(typeline.isChild(texpr_types))
        self.assertEqual(texpr_types.getParent(), typeline)

        self.assertTrue(typeline.hasSupertype(t_legendary))
        self.assertTrue(typeline.hasType(t_creature))
        self.assertTrue(typeline.hasSubtype(t_human))

        self.assertEqual(typeline.unparseToString().lower(),
                         "legendary creature — human cleric")
Beispiel #9
0
    def test_CreateTokenExpressions(self):

        saproling_description = MgDescriptionExpression(
            #1/1
            MgPTExpression(
                MgNumberValue(1, MgNumberValue.NumberTypeEnum.Literal),
                MgNumberValue(1, MgNumberValue.NumberTypeEnum.Literal)),
            #green
            MgColorExpression(MgColorTerm(MgColorTerm.ColorTermEnum.Green)),
            #saproling creature
            MgTypeExpression(
                MgSubtype(MgSubtype.CreatureSubtypeEnum.Saproling),
                MgType(MgType.TypeEnum.Creature)),
            #token
            MgQualifier(MgQualifier.QualifierEnum.Token))
        three_of_them = MgNumberValue(3, MgNumberValue.NumberTypeEnum.Quantity)
        create_three_saprolings = MgCreateTokenExpression(
            descriptor=saproling_description, quantity=three_of_them)

        self.assertTrue(create_three_saprolings.isTraversable())
        self.assertEqual(len(create_three_saprolings.getTraversalSuccessors()),
                         2)
        self.assertTrue(create_three_saprolings.isChild(saproling_description))
        self.assertEqual(saproling_description.getParent(),
                         create_three_saprolings)
        self.assertTrue(create_three_saprolings.isChild(three_of_them))
        self.assertEqual(three_of_them.getParent(), create_three_saprolings)

        self.assertEqual(create_three_saprolings.unparseToString().lower(),
                         "create three 1/1 green saproling creature token")
Beispiel #10
0
    def test_TapUntapExpressions(self):
        t_creature = MgType(MgType.TypeEnum.Creature)
        typeexpr = MgTypeExpression(t_creature)
        targetExpr = MgTargetExpression(typeexpr)

        tapExpr = MgTapUntapExpression(targetExpr, tap=True, untap=False)

        self.assertTrue(tapExpr.isTraversable())
        self.assertEqual(len(tapExpr.getTraversalSuccessors()), 1)
        self.assertTrue(tapExpr.isChild(targetExpr))
        self.assertEqual(targetExpr.getParent(), tapExpr)

        self.assertTrue(tapExpr.isTap())
        self.assertFalse(tapExpr.isUntap())
        self.assertEqual(tapExpr.unparseToString().lower(),
                         "tap target creature")

        tapExpr.setTap(False)
        tapExpr.setUntap(True)
        self.assertFalse(tapExpr.isTap())
        self.assertTrue(tapExpr.isUntap())
        self.assertEqual(tapExpr.unparseToString().lower(),
                         "untap target creature")

        tapExpr.setTap(True)
        self.assertEqual(tapExpr.unparseToString().lower(),
                         "tap or untap target creature")
Beispiel #11
0
 def test_TypeExpressions(self):
         t_legendary = MgSupertype(MgSupertype.SupertypeEnum.Legendary)
         t_human = MgSubtype(MgSubtype.CreatureSubtypeEnum.Human)
         t_cleric = MgSubtype(MgSubtype.CreatureSubtypeEnum.Cleric)
         
         texpr = MgTypeExpression(t_legendary,t_human,t_cleric)
         
         self.assertTrue(t_legendary.isTraversable())
         self.assertEqual(len(texpr.getTraversalSuccessors()),3)
         
         self.assertTrue(texpr.isChild(t_legendary))
         self.assertEqual(t_legendary.getParent(),texpr)
         
         self.assertEqual(texpr.unparseToString().lower(),"legendary human cleric")
         
         ##test pluralization
         #texpr.setPlural(True)
         #self.assertEqual(texpr.unparseToString().lower(),"legendary human clerics")
         
         #test comma delimitation.
         nonvampire = MgNonExpression(MgSubtype(MgSubtype.CreatureSubtypeEnum.Vampire))
         nonwerewolf = MgNonExpression(MgSubtype(MgSubtype.CreatureSubtypeEnum.Werewolf))
         nonzombie = MgNonExpression(MgSubtype(MgSubtype.CreatureSubtypeEnum.Zombie))
         t_creature = MgType(MgType.TypeEnum.Creature)
         
         commaExpr = MgTypeExpression(nonvampire,nonwerewolf,nonzombie,t_creature)
         commaExpr.setCommaDelimited(True)
         self.assertEqual(commaExpr.unparseToString().lower(),"non-vampire, non-werewolf, non-zombie creature")
Beispiel #12
0
    def test_Forecast(self):
        return None  #TODO
        manaCost = MgManaExpression(
            MgManaSymbol(cvalue=1),
            MgManaSymbol(colorv=MgManaSymbol.ManaType.White))

        tap_creature = MgStatementSequence(
            MgStatement(
                MgTapUntapExpression(MgTargetExpression(
                    MgTypeExpression(MgType(MgType.TypeEnum.Creature))),
                                     tap=True)))

        activatedAbility = MgActivatedAbility(
            cost=None,
            instructions=tap_creature,
            abilityWord=None,  #Forecast is in fact *not* an ability word.
            reminderText=
            None  #The reminder text is attached to Forecast, not the underlying ability.
        )
        reminder = MgReminderText(
            "Activate this ability only during your upkeep and only once each turn."
        )

        forecast = MgForecastAbility(activatedAbility=activatedAbility,
                                     reminderText=reminder)
Beispiel #13
0
    def test_Landwalk(self):
        t_island_expr = MgTypeExpression(
            MgSubtype(MgSubtype.LandSubtypeEnum.Island))
        islandwalk = MgLandwalkAbility(landtype=t_island_expr)

        self.assertTrue(islandwalk.isTraversable())
        self.assertTrue(islandwalk.hasLandType())
        self.assertEqual(len(islandwalk.getTraversalSuccessors()), 1)
        self.assertTrue(islandwalk.isChild(t_island_expr))
        self.assertEqual(t_island_expr.getParent(), islandwalk)
        self.assertEqual(islandwalk.unparseToString().lower(), "islandwalk")

        t_nonbasic_land_expr = MgTypeExpression(
            MgNonExpression(MgSupertype(MgSupertype.SupertypeEnum.Basic)),
            MgType(MgType.TypeEnum.Land))

        nonbasiclandwalk = MgLandwalkAbility(landtype=t_nonbasic_land_expr)
        self.assertEqual(nonbasiclandwalk.unparseToString().lower(),
                         "non-basic landwalk")

        #Used when talking about landwalk abilities in general.
        landwalk = MgLandwalkAbility()
        self.assertEqual(landwalk.unparseToString().lower(), "landwalk")

        t_lair_expr = MgTypeExpression(
            MgSubtype(MgSubtype.LandSubtypeEnum.Lair))
        landwalk.setLandType(t_lair_expr)
        self.assertEqual(landwalk.getLandType(), t_lair_expr)
        self.assertTrue(landwalk.isChild(t_lair_expr))
        self.assertEqual(t_lair_expr.getParent(), landwalk)
        self.assertEqual(landwalk.unparseToString().lower(), "lairwalk")
Beispiel #14
0
    def test_Affinity(self):
        t_artifact = MgTypeExpression(MgType(MgType.TypeEnum.Artifact))
        affinity = MgAffinityAbility(descriptor=t_artifact)
        self.assertTrue(affinity.isChild(t_artifact))
        self.assertEqual(t_artifact.getParent(), affinity)
        self.assertEqual(affinity.getDescriptor(), t_artifact)
        self.assertEqual(len(affinity.getTraversalSuccessors()), 1)

        #The default unparser does not perform pluralization.
        self.assertEqual(affinity.unparseToString().lower(),
                         "affinity for artifact")

        t_planeswalker = MgTypeExpression(MgType(MgType.TypeEnum.Planeswalker))
        affinity.setDescriptor(t_planeswalker)
        self.assertEqual(affinity.getDescriptor(), t_planeswalker)
        self.assertEqual(affinity.unparseToString().lower(),
                         "affinity for planeswalker")
Beispiel #15
0
    def test_Enchant(self):
        t_creature = MgTypeExpression(MgType(MgType.TypeEnum.Creature))
        ability = MgEnchantAbility(t_creature)

        self.assertTrue(ability.isTraversable())
        self.assertEqual(len(ability.getTraversalSuccessors()), 1)
        self.assertTrue(ability.isChild(t_creature))
        self.assertEqual(t_creature.getParent(), ability)
        self.assertEqual(ability.unparseToString().lower(), "enchant creature")
 def test_thatReferences(self):
         color_white = MgColorExpression(MgColorTerm(MgColorTerm.ColorTermEnum.White))
         t_enchantment = MgTypeExpression(MgType(MgType.TypeEnum.Enchantment))
         original_enchantment_description = MgDescriptionExpression(color_white,t_enchantment)
         targetExpr = MgTargetExpression(original_enchantment_description)
         
         
         descriptor_enchantment = MgDescriptionExpression(MgTypeExpression(MgType(MgType.TypeEnum.Enchantment)))
         thatref_enchantment = MgThatReference(descriptor=descriptor_enchantment,antecedent=original_enchantment_description)
         
         self.assertTrue(thatref_enchantment.isTraversable())
         self.assertEqual(len(thatref_enchantment.getTraversalSuccessors()),1)
         self.assertTrue(thatref_enchantment.isChild(descriptor_enchantment))
         self.assertEqual(descriptor_enchantment.getParent(),thatref_enchantment)
         self.assertEqual(thatref_enchantment.getDescriptor(),descriptor_enchantment)
         
         self.assertTrue(thatref_enchantment.hasAntecedent())
         self.assertEqual(thatref_enchantment.getAntecedent(),original_enchantment_description)
         thatref_enchantment.setAntecedent(original_enchantment_description)
         
         
         self.assertEqual(thatref_enchantment.getAntecedent(),original_enchantment_description)
         self.assertEqual(thatref_enchantment.unparseToString().lower(),"that enchantment")
Beispiel #17
0
    def test_DestroyExpressions(self):
        t_creature = MgType(MgType.TypeEnum.Creature)
        typeExpr = MgTypeExpression(t_creature)
        allcreatures = MgAllExpression(typeExpr)

        destroyExpr = MgDestroyExpression(allcreatures)

        self.assertTrue(destroyExpr.isTraversable())
        self.assertEqual(len(destroyExpr.getTraversalSuccessors()), 1)
        self.assertTrue(destroyExpr.isChild(allcreatures))
        self.assertEqual(allcreatures.getParent(), destroyExpr)

        self.assertEqual(destroyExpr.unparseToString().lower(),
                         "destroy all creature")
Beispiel #18
0
 def test_NonExpressions(self):
         t_ferret = mtgcompiler.AST.mtypes.MgSubtype(mtgcompiler.AST.mtypes.MgSubtype.CreatureSubtypeEnum.Ferret)
         nonferret = MgNonExpression(t_ferret)
         self.assertEqual(nonferret.unparseToString().lower(),"non-ferret")
         
         self.assertTrue(nonferret.isTraversable())
         self.assertEqual(len(nonferret.getTraversalSuccessors()),1)
         self.assertTrue(nonferret.isChild(t_ferret))
         self.assertEqual(t_ferret.getParent(),nonferret)                
         
         t_legendary = MgSupertype(MgSupertype.SupertypeEnum.Legendary)
         nonlegendary = MgNonExpression(t_legendary)
         t_creature = MgType(MgType.TypeEnum.Creature)
         typeexpr = MgTypeExpression(nonlegendary,t_creature)
         self.assertEqual(typeexpr.unparseToString().lower(),"non-legendary creature")
Beispiel #19
0
    def test_UncastExpressions(self):

        t_nonenchantment = MgTypeExpression(
            MgNonExpression(MgType(MgType.TypeEnum.Enchantment)))
        q_spell = MgQualifier(MgQualifier.QualifierEnum.Spell)
        description = MgDescriptionExpression(t_nonenchantment, q_spell)
        targetExpr = MgTargetExpression(description)

        uncastExpr = MgUncastExpression(targetExpr)

        self.assertTrue(uncastExpr.isTraversable())
        self.assertEqual(len(uncastExpr.getTraversalSuccessors()), 1)
        self.assertTrue(uncastExpr.isChild(targetExpr))
        self.assertEqual(targetExpr.getParent(), uncastExpr)

        self.assertEqual(uncastExpr.unparseToString().lower(),
                         "counter target non-enchantment spell")
 def test_selfReferences(self):
         creature_description = MgDescriptionExpression(MgTypeExpression(MgType(MgType.TypeEnum.Creature)))
         targetExpr = MgTargetExpression(creature_description)
         
         selfref = MgSelfReference(reftype=MgSelfReference.SelfEnum.Neutral,antecedent=creature_description)
         
         self.assertTrue(selfref.isTraversable())
         self.assertEqual(len(selfref.getTraversalSuccessors()),0)
         self.assertTrue(selfref.hasAntecedent())
         selfref.setAntecedent(creature_description)
         self.assertEqual(selfref.getAntecedent(),creature_description)
         self.assertTrue(selfref.isNeutral())
         self.assertEqual(selfref.unparseToString().lower(),"itself")
         
         selfref.setNeutral()
         selfref.setMale()
         self.assertTrue(selfref.isMale())
         self.assertEqual(selfref.unparseToString().lower(),"himself")
         
         selfref.setFemale()
         self.assertTrue(selfref.isFemale())
         self.assertEqual(selfref.unparseToString().lower(),"herself")