I1M-0.0.1: test/PolOperacionesPropiedades.hs
-- |
-- Module : PolOperacionesPropiedades
-- Description : Propiedades de las Operaciones con el TAD de los polinomios.
-- License : Creative Commons
-- Maintainer : José A. Alonso
{-# LANGUAGE FlexibleInstances #-}
module PolOperacionesPropiedades (tests) where
import I1M.PolOperaciones
import Test.Tasty
import Test.Tasty.QuickCheck
import Test.Tasty.HUnit
-- ---------------------------------------------------------------------
-- Generador de polinomios --
-- ---------------------------------------------------------------------
-- (genPol n) es un generador de polinomios. Por ejemplo,
-- ghci> sample (genPol 1)
-- 7*x^9 + 9*x^8 + 10*x^7 + -14*x^5 + -15*x^2 + -10
-- -4*x^8 + 2*x
-- -8*x^9 + 4*x^8 + 2*x^6 + 4*x^5 + -6*x^4 + 5*x^2 + -8*x
-- -9*x^9 + x^5 + -7
-- 8*x^10 + -9*x^7 + 7*x^6 + 9*x^5 + 10*x^3 + -1*x^2
-- 7*x^10 + 5*x^9 + -5
-- -8*x^10 + -7
-- -5*x
-- 5*x^10 + 4*x^4 + -3
-- 3*x^3 + -4
-- 10*x
genPol :: Int -> Gen (Polinomio Int)
genPol 0 = return polCero
genPol n = do n <- choose (0,10)
b <- choose (-10,10)
p <- genPol (div n 2)
return (consPol n b p)
instance Arbitrary (Polinomio Int) where
arbitrary = sized genPol
-- ---------------------------------------------------------------------
-- Propiedades --
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Suma de polinomios --
-- ---------------------------------------------------------------------
-- Propiedad. El polinomio cero es el elemento neutro de la suma.
prop_neutroSumaPol :: Polinomio Int -> Bool
prop_neutroSumaPol p =
sumaPol polCero p == p
-- Comprobación con QuickCheck.
-- ghci> quickCheck prop_neutroSumaPol
-- OK, passed 100 tests.
-- Propiedad. La suma es conmutativa.
prop_conmutativaSuma :: Polinomio Int -> Polinomio Int -> Bool
prop_conmutativaSuma p q =
sumaPol p q == sumaPol q p
-- Comprobación:
-- ghci> quickCheck prop_conmutativaSuma
-- OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Producto de polinomios --
-- ---------------------------------------------------------------------
-- Propiedad. El producto de polinomios es conmutativo.
prop_conmutativaProducto :: Polinomio Int -> Polinomio Int -> Bool
prop_conmutativaProducto p q =
multPol p q == multPol q p
-- La comprobación es
-- ghci> quickCheck prop_conmutativaProducto
-- OK, passed 100 tests.
-- El producto es distributivo respecto de la suma.
prop_distributivaProductoSuma :: Polinomio Int -> Polinomio Int
-> Polinomio Int -> Bool
prop_distributivaProductoSuma p q r =
multPol p (sumaPol q r) == sumaPol (multPol p q) (multPol p r)
-- Comprobación:
-- ghci> quickCheck prop_distributivaProductoSuma
-- OK, passed 100 tests.
-- Propiedad. El polinomio unidad es el elemento neutro del producto.
prop_polUnidad :: Polinomio Int -> Bool
prop_polUnidad p =
multPol p polUnidad == p
-- Comprobación:
-- ghci> quickCheck prop_polUnidad
-- OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Derivación de polinomios --
-- ---------------------------------------------------------------------
-- Propiedad. La derivada de la suma es la suma de las derivadas.
prop_derivada :: Polinomio Int -> Polinomio Int -> Bool
prop_derivada p q =
derivada (sumaPol p q) == sumaPol (derivada p) (derivada q)
-- Comprobación
-- ghci> quickCheck prop_derivada
-- OK, passed 100 tests.
-- ---------------------------------------------------------------------
-- Comprobaciones --
-- ---------------------------------------------------------------------
ejPol1, ejPol2, ejPol3, ejTerm:: Polinomio Int
ejPol1 = consPol 4 3 (consPol 2 (-5) (consPol 0 3 polCero))
ejPol2 = consPol 5 1 (consPol 2 5 (consPol 1 4 polCero))
ejPol3 = consPol 4 6 (consPol 1 2 polCero)
ejTerm = consPol 1 4 polCero
tests :: TestTree
tests =
testGroup "Propiedades de las operaciones con polinomios"
[ testGroup "Ejemplos"
[ testCase "termLider" $
termLider ejPol2 @?= creaTermino 5 1
, testCase "valor1" $
valor ejPol1 0 @?= 3
, testCase "valor2" $
valor ejPol1 1 @?= 1
, testCase "valor3" $
valor ejPol1 (-2) @?= 31
, testCase "esRaiz1" $
esRaiz 1 ejPol3 @?= False
, testCase "esRaiz2" $
esRaiz 0 ejPol3 @?= True
]
, testGroup "Propiedades"
[testProperty "P1" prop_neutroSumaPol,
testProperty "P2" prop_conmutativaSuma,
testProperty "P3" prop_conmutativaProducto,
testProperty "P4" prop_distributivaProductoSuma,
testProperty "P5" prop_polUnidad,
testProperty "P6" prop_derivada]]