/**
 * This class contains unit tests for validating the behavior of Apex classes
 * and triggers.
 *
 * Unit tests are class methods that verify whether a particular piece
 * of code is working properly. Unit test methods take no arguments,
 * commit no data to the database, and are flagged with the testMethod
 * keyword in the method definition.
 *
 * All test methods in an organization are executed whenever Apex code is deployed
 * to a production organization to confirm correctness, ensure code
 * coverage, and prevent regressions. All Apex classes are
 * required to have at least 75% code coverage in order to be deployed
 * to a production organization. In addition, all triggers must have some code coverage.
 * 
 * The @isTest class annotation indicates this class only contains test
 * methods. Classes defined with the @isTest annotation do not count against
 * the organization size limit for all Apex scripts.
 *
 * See the Apex Language Reference for more information about Testing and Code Coverage.
 */
@isTest
private class CheckEventTimeChangeTest {

    static testMethod void test01() {
        Date t = Date.today();
        Date t1 = t.addMonths(6);
        Date t2 = t.addMonths(-6);
        
        Event e = new Event(
            StartDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 9, 0, 0),
            EndDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 10, 0, 0)
        );
        insert e;
        
        e = [select IsScheduled__c, ActivityDateModifiedDate__c from Event where Id = :e.Id];
        // ①新規する時、ActivityDateModifiedDate__cは今日
        System.assertEquals(t, e.ActivityDateModifiedDate__c);
        // ②未来日なので、計画です
        System.assertEquals(true, e.IsScheduled__c);
        
        e.StartDateTime = Datetime.newInstance(t2.year(), t2.month(), t2.day(), 10, 0, 0);
        e.EndDateTime = Datetime.newInstance(t2.year(), t2.month(), t2.day(), 11, 0, 0);
        update e;
        
        e = [select IsScheduled__c, ActivityDateModifiedDate__c from Event where Id = :e.Id];
        // ③過去日なので、計画ではない
        System.assertEquals(false, e.IsScheduled__c);
        
        e.StartDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 8, 0, 0);
        e.EndDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 9, 0, 0);
        update e;
        
        e = [select IsScheduled__c, ActivityDateModifiedDate__c from Event where Id = :e.Id];
        // ④未来日なので、計画です
        System.assertEquals(true, e.IsScheduled__c);
    }
    
    static testMethod void test02() {
        Date t = Date.today();
        Date t1 = t.addMonths(6);
        Date t2 = t.addMonths(-6);
        Date t3 = t2.addDays(10);
        
        Event e = new Event(
            StartDateTime = Datetime.newInstance(t2.year(), t2.month(), t2.day(), 9, 0, 0),
            EndDateTime = Datetime.newInstance(t2.year(), t2.month(), t2.day(), 10, 0, 0)
        );
        insert e;
        // 過去の計画Eventの更新を模擬するため、項目値を強制変更
        e.ActivityDateModifiedDate__c = Date.newInstance(t2.year(), t2.month(), t2.day());
        e.isScheduled__c = true;
        update e;
        
        e.StartDateTime = Datetime.newInstance(t2.year(), t2.month(), t2.day(), 10, 0, 0);
        e.EndDateTime = Datetime.newInstance(t2.year(), t2.month(), t2.day(), 11, 0, 0);
        update e;
        
        e = [select IsScheduled__c, ActivityDateModifiedDate__c from Event where Id = :e.Id];
        // ①更新（活動日変わらない）の時、ActivityDateModifiedDate__cそのまま
        System.assertEquals(Date.newInstance(t2.year(), t2.month(), t2.day()), e.ActivityDateModifiedDate__c);
        // ②過去の計画でも、活動日変わらないので、IsScheduled__cそのまま
        System.assertEquals(true, e.IsScheduled__c);
        
        e.StartDateTime = Datetime.newInstance(t3.year(), t3.month(), t3.day(), 10, 0, 0);
        e.EndDateTime = Datetime.newInstance(t3.year(), t3.month(), t3.day(), 11, 0, 0);
        update e;
        
        e = [select IsScheduled__c, ActivityDateModifiedDate__c from Event where Id = :e.Id];
        // ③更新（活動日変わる）の時、ActivityDateModifiedDate__cは今日
        System.assertEquals(Date.today(), e.ActivityDateModifiedDate__c);
        // ②活動日変わって、フラグ再設定、過去なので計画ではない
        System.assertEquals(false, e.IsScheduled__c);
        
        e.StartDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 10, 0, 0);
        e.EndDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 11, 0, 0);
        update e;
        
        e = [select IsScheduled__c, ActivityDateModifiedDate__c from Event where Id = :e.Id];
        // ③更新（活動日変わる）の時、ActivityDateModifiedDate__cは今日
        System.assertEquals(Date.today(), e.ActivityDateModifiedDate__c);
        // ②活動日変わって、フラグ再設定、未来なので計画です
        System.assertEquals(true, e.IsScheduled__c);
    }
    
    static testMethod void test03() {
        Date t = Date.today();
        Date t1 = t.addMonths(6);
        Date t2 = t.addMonths(-6);
        Date t3 = t.addYears(1);
        
        Daily_Report__c dr1 = new Daily_Report__c(
            Reported_Date__c = t1,
            Status__c = '作成中',
            Reporter__c = Userinfo.getUserId()
        );
        Daily_Report__c dr2 = new Daily_Report__c(
            Reported_Date__c = t2,
            Status__c = '作成中',
            Reporter__c = Userinfo.getUserId()
        );
        
        insert new Daily_Report__c[] {dr1, dr2};
        
        Event__c ec1 = new Event__c(
            Daily_Report__c = dr1.Id,
            StartDateTime__c = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 10, 0, 0),
            EndDateTime__c = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 11, 0, 0),
            ActivityDate__c = dr1.Reported_Date__c,
            Subject__c = 'eventc1'
        );
        insert ec1;
        
        Event__c ec2 = new Event__c(
            Daily_Report__c = dr2.Id,
            StartDateTime__c = Datetime.newInstance(t2.year(), t2.month(), t2.day(), 10, 0, 0),
            EndDateTime__c = Datetime.newInstance(t2.year(), t2.month(), t2.day(), 11, 0, 0),
            ActivityDate__c = dr2.Reported_Date__c,
            Subject__c = 'eventc2'
        );
        insert ec2;
        
        // 未来EventCなので、計画立つ
        ec1 = [select IsScheduled__c, StartDateTime__c, IsScheduled_StartDateTime__c, EndDateTime__c, 
              IsScheduled_EndDateTime__c, Location__c, IsScheduled_Location__c, 
              Subject__c, IsScheduled_Subject__c from Event__c where Id = :ec1.Id];
        System.assertEquals(true, ec1.IsScheduled__c);
        System.assertEquals(ec1.StartDateTime__c, ec1.IsScheduled_StartDateTime__c);
        System.assertEquals(ec1.EndDateTime__c, ec1.IsScheduled_EndDateTime__c);
        System.assertEquals(ec1.Location__c, ec1.IsScheduled_Location__c);
        System.assertEquals(ec1.Subject__c, ec1.IsScheduled_Subject__c);
        
        // 過去EventCなので、計画なし
        ec2 = [select IsScheduled__c, StartDateTime__c, IsScheduled_StartDateTime__c, EndDateTime__c, 
              IsScheduled_EndDateTime__c, Location__c, IsScheduled_Location__c, 
              Subject__c, IsScheduled_Subject__c from Event__c where Id = :ec2.Id];
        System.assertEquals(false, ec2.IsScheduled__c);
        System.assertEquals(null, ec2.IsScheduled_StartDateTime__c);
        System.assertEquals(null, ec2.IsScheduled_EndDateTime__c);
        System.assertEquals(null, ec2.IsScheduled_Location__c);
        System.assertEquals(null, ec2.IsScheduled_Subject__c);
        
        // --------------------Event__cより作成したEventの更新--------------------
        StaticParameter.NotUpdEventCFlg = false;
        
        Event e2 = [select Id from Event where EventC_ID__c = :ec2.Id];
        e2.ActivityDateModifiedDate__c = Date.newInstance(t2.year(), t2.month(), t2.day());
        e2.StartDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 15, 0, 0);
        e2.EndDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 18, 0, 0);
        update e2;
        
        // Eventを未来日に変更、計画立つ
        ec2 = [select IsScheduled__c, StartDateTime__c, IsScheduled_StartDateTime__c, EndDateTime__c, 
              IsScheduled_EndDateTime__c, Location__c, IsScheduled_Location__c, 
              Subject__c, IsScheduled_Subject__c, Daily_Report__c from Event__c where Id = :ec2.Id];
        System.assertEquals(true, ec2.IsScheduled__c);
        System.assertEquals(ec2.StartDateTime__c, ec2.IsScheduled_StartDateTime__c);
        System.assertEquals(ec2.EndDateTime__c, ec2.IsScheduled_EndDateTime__c);
        System.assertEquals(ec2.Location__c, ec2.IsScheduled_Location__c);
        System.assertEquals(ec2.Subject__c, ec2.IsScheduled_Subject__c);
        System.assertEquals(dr1.Id, ec2.Daily_Report__c);
        
        e2 = [select ActivityDateModifiedDate__c from Event where EventC_ID__c = :ec2.Id];
        System.assertEquals(Date.today(), e2.ActivityDateModifiedDate__c);
        
        // 変更不可のエラーをキャッチ
        e2.StartDateTime = Datetime.newInstance(t3.year(), t3.month(), t3.day(), 15, 0, 0);
        e2.EndDateTime = Datetime.newInstance(t3.year(), t3.month(), t3.day(), 16, 0, 0);
        try {
            update e2;
        } catch (Exception exp) {
            System.assertEquals(true, true);
        }
    }
    
    static testMethod void test04() {
        Date t = Date.today();
        Date t1 = t.addMonths(6);
        
        Daily_Report__c dr1 = new Daily_Report__c(
            Reported_Date__c = t1,
            Status__c = '作成中',
            Reporter__c = Userinfo.getUserId()
        );
        insert dr1;
        
        Event__c ec1 = new Event__c(
            Daily_Report__c = dr1.Id,
            StartDateTime__c = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 10, 0, 0),
            EndDateTime__c = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 11, 0, 0),
            ActivityDate__c = dr1.Reported_Date__c,
            Subject__c = 'eventc1'
        );
        insert ec1;
        
        StaticParameter.NotUpdEventCFlg = false;
        
        Event e1 = [select Id from Event where EventC_ID__c = :ec1.Id];
        e1.StartDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 9, 0, 0);
        e1.EndDateTime = Datetime.newInstance(t1.year(), t1.month(), t1.day(), 18, 0, 0);
        update e1;
        
        ec1 = [select IsScheduled__c, StartDateTime__c, EndDateTime__c, IsScheduled_StartDateTime__c, IsScheduled_EndDateTime__c from Event__c where Id = :ec1.Id];
        System.assertEquals(true, ec1.IsScheduled__c);
        System.assertEquals(Datetime.newInstance(t1.year(), t1.month(), t1.day(), 10, 0, 0), ec1.IsScheduled_StartDateTime__c);
        System.assertEquals(Datetime.newInstance(t1.year(), t1.month(), t1.day(), 11, 0, 0), ec1.IsScheduled_EndDateTime__c);
        System.assertNotEquals(ec1.IsScheduled_StartDateTime__c, ec1.StartDateTime__c);
        System.assertNotEquals(ec1.IsScheduled_EndDateTime__c, ec1.EndDateTime__c);
    }
}