text: /// <reference path="SpecHelper.js" />
  /// <reference path="../app/Player.js" />
  /// <reference path="../app/Song.js" />
  
  describe("Player", function() {
    var player;
    var song;
  
    beforeEach(function() {
      player = new Player();
      song = new Song();
    });
  
    it("should be able to play a Song", function() {
      player.play(song);
      expect(player.currentlyPlayingSong).toEqual(song);
  
      //demonstrates use of custom matcher
      expect(player).toBePlaying(song);
    });
  
    describe("when song has been paused", function() {
      beforeEach(function() {
        player.play(song);
        player.pause();
      });
  
      it("should indicate that the song is currently paused", function() {
        expect(player.isPlaying).toBeFalsy();
  
        // demonstrates use of 'not' with a custom matcher
        expect(player).not.toBePlaying(song);
      });
  
      it("should be possible to resume", function() {
        player.resume();
        expect(player.isPlaying).toBeTruthy();
        expect(player.currentlyPlayingSong).toEqual(song);
      });
    });
  
    // demonstrates use of spies to intercept and test method calls
    it("tells the current song if the user has made it a favorite", function() {
      spyOn(song, 'persistFavoriteStatus');
  
      player.play(song);
      player.makeFavorite();
  
      expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true);
    });
  
    //demonstrates use of expected exceptions
    describe("#resume", function() {
      it("should throw an exception if song is already playing", function() {
        player.play(song);
  
        expect(function() {
          player.resume();
        }).toThrow("song is already playing");
      });
    });
  });