%TestCase Class defining interface for test cases
%   The TestCase class defines an individual test case.
%
%   Normally a test writer will create their own test class that is a subclass
%   of TestCase and that includes beginning with "test".  Each instance of the
%   TestCase subclass that gets created will be associated with a single test
%   method.
%
%   If a test fixture is needed, override the setUp() and tearDown() methods.
%
%   TestSuite(subclass_name), where subclass_name is the name of a TestCase
%   subclass, creates a test suite containing one TestCase instance per test
%   method contained in the subclass.
%
%   A simpler test-writing alternative to use subfunction-based M-file tests.
%   See the MATLAB xUnit documentation.
%
%   TestCase methods:
%       TestCase - Constructor
%       run      - Execute the test case
%
%   TestCase properties:
%       Location - Location of M-file containing the test case
%       Name     - Name of test case
%
%   See also TestComponent, TestSuite

%   Steven L. Eddins
%   Copyright 2008-2009 The MathWorks, Inc.

classdef TestCase < TestComponent
    
    properties
        MethodName
    end

    methods
        function self = TestCase(testMethod)
            %TestCase Constructor
            %   TestCase(methodName) constructs a TestCase object using the
            %   specified testMethod (a string).
            
            self.MethodName = testMethod;
            self.Name = testMethod;
            self.Location = which(class(self));
        end
        
        function did_pass = run(self, monitor)
            %run Execute the test case
            %    test_case.run(monitor) calls the TestCase object's setUp()
            %    method, then the test method, then the tearDown() method.
            %    observer is a TestRunObserver object.  The testStarted(),
            %    testFailure(), testError(), and testFinished() methods of
            %    observer are called at the appropriate times.  monitor is a
            %    TestRunMonitor object.  Typically it is either a TestRunLogger
            %    subclass or a CommandWindowTestRunDisplay subclass.
            %
            %    test_case.run() automatically uses a
            %    CommandWindowTestRunDisplay object in order to print test
            %    suite execution information to the Command Window.
            
            if nargin < 2
                monitor = CommandWindowTestRunDisplay();
            end
            
            did_pass = true;
            monitor.testComponentStarted(self);
            
            try
                self.setUp();
                f = str2func(self.MethodName);
                
                try
                    % Call the test method.
                    f(self);
                catch failureException
                    monitor.testCaseFailure(self, failureException);
                    did_pass = false;
                end
                
                self.tearDown();
                
            catch errorException
                monitor.testCaseError(self, errorException);
                did_pass = false;
            end
            
            monitor.testComponentFinished(self, did_pass);
        end
        
        function num = numTestCases(self)
            num = 1;
        end
           
        function print(self, numLeadingBlanks)
            if nargin < 2
                numLeadingBlanks = 0;
            end
            fprintf('%s%s\n', blanks(numLeadingBlanks), self.Name);
        end
        
    end
    
end
