text: var _; // globals
  
  describe("About Applying What We Have Learnt", function() {
    var products;
  
    beforeEach(function () { 
      products = [
         { name: "Sonoma", ingredients: ["artichoke", "sundried tomatoes", "mushrooms"], containsNuts: false },
         { name: "Pizza Primavera", ingredients: ["roma", "sundried tomatoes", "goats cheese", "rosemary"], containsNuts: false },
         { name: "South Of The Border", ingredients: ["black beans", "jalapenos", "mushrooms"], containsNuts: false },
         { name: "Blue Moon", ingredients: ["blue cheese", "garlic", "walnuts"], containsNuts: true },
         { name: "Taste Of Athens", ingredients: ["spinach", "kalamata olives", "sesame seeds"], containsNuts: true }
      ];
    });
  
    /*********************************************************************************/
  
    it("given I'm allergic to nuts and hate mushrooms, it should find a pizza I can eat (imperative)", function () {
      var i,j,hasMushrooms, productsICanEat = [];
  
      for (i = 0; i < products.length; i+=1) {
          if (products[i].containsNuts === false) {
              hasMushrooms = false;
              for (j = 0; j < products[i].ingredients.length; j+=1) {
                 if (products[i].ingredients[j] === "mushrooms") {
                    hasMushrooms = true;
                 }
              }
              if (!hasMushrooms) productsICanEat.push(products[i]);
      
          }
      }
  
      expect(productsICanEat.length).toBe(1);
    });
  
    it("given I'm allergic to nuts and hate mushrooms, it should find a pizza I can eat (functional)", function () {
        var productsICanEat = [];
        // var hasMushrooms = false
  
        /* solve using filter() & all() / any() */
        // productsICanEat = _.filter(products, function(pizza) {
        //   if(pizza.containsNuts === false) {
        //      var hasMushrooms = _.some(pizza.ingredients, function(ing) { return ing === "mushrooms"})
        //       return  !hasMushrooms
             
        //   }
        // })
        productsICanEat = _.filter(products, function(pizza) {
          return pizza.containsNuts === false && 
          !_.some(pizza.ingredients, function(ing) {
             return ing === "mushrooms"})
        })
  
        expect(productsICanEat.length).toBe(1);
    });
  
    /*********************************************************************************/
  
    it("should add all the natural numbers below 1000 that are multiples of 3 or 5 (imperative)", function () {
      var sum = 0;
  
      for(var i=1; i<1000; i+=1) {
        if (i % 3 === 0 || i % 5 === 0) {
  
          sum += i;
        }
      }
      
      expect(sum).toBe(233168);
    });
  
    it("should add all the natural numbers below 1000 that are multiples of 3 or 5 (functional)", function () {
         /* try chaining range() and reduce() */
  
      
      // var sum = _.reduce(_.range(1, 1000), function(sum, num){
      //   if(num % 3 === 0 || num % 5 === 0) {
      //    return sum + num;
      // } 
      //   return sum;
      // }, 0)
      var sum = _.chain(1).range(1000)
        .reduce(function(sum, num){
          if(num % 3 === 0 || num % 5 === 0) {
           return sum + num;
          } 
          return sum;
        }, 0)
        .value();
      expect(233168).toBe(sum);
    });
  
    /*********************************************************************************/
     it("should count the ingredient occurrence (imperative)", function () {
      var ingredientCount = { "{ingredient name}": 0 };
  
      for (i = 0; i < products.length; i+=1) {
          for (j = 0; j < products[i].ingredients.length; j+=1) {
              ingredientCount[products[i].ingredients[j]] = (ingredientCount[products[i].ingredients[j]] || 0) + 1;
          }
      }
  
      expect(ingredientCount['mushrooms']).toBe(2);
    });
  
    it("should count the ingredient occurrence (functional)", function () {
      var ingredientCount = { "{ingredient name}": 0 };
  
      /* chain() together map(), flatten() and reduce() */
      
      ingredientCount = _.chain(products)
        .map(function(pizza) {return pizza.ingredients})
        .flatten()
        .reduce(function(acc, ing) {
          if(!acc[ing]) {
            acc[ing] = 1
          } else {
             acc[ing]++
          }
          return acc
        }, {})
        .value();
  
      
      expect(ingredientCount['mushrooms']).toBe(2);
    });
  
    /*********************************************************************************/
    /* UNCOMMENT FOR ADVANCED */
    
    it("should find the largest prime factor of a composite number", 
      function(n) {
    
      var factors = [];
      var primefactor = 0;
  
      for(var i = 0; i <= n; i++) {
        if(n%i === 0) {
          factors.push(i)
        }
      }
  
      _.each(factors, function(factor) { 
        if(factor <= 3) {
          primefactor = factor
        } else if(factor %2 !== 0 && factor% 3 !== 0) {
          primefactor = factor
        }
      })
  
      return primefactor
      
   
    });
  
    // it("should find the largest palindrome made from the product of two 3 digit numbers", function () {
      
    // });
  
    // it("should find the smallest number divisible by each of the numbers 1 to 20", function () {
        
      
    // });
  
    // it("should find the difference between the sum of the squares and the square of the sums", function () {
      
    // });
  
    // it("should find the 10001st prime", function () {
  
    // });
    
  });
  