コード例 #1
0
        private static void ValidateNode(SequencingRuleNodeReader nodeReader)
        {
            if (nodeReader == null)
            {
                return;
            }

            ValidateCollection(nodeReader.Conditions); // caught BadProperties2
            ValidateProperty(nodeReader.Action);       // caught BadProperties2
            ValidateProperty(nodeReader.Combination);  // caught BadProperties3
        }
コード例 #2
0
ファイル: Scorm2004SeqNav.cs プロジェクト: supermuk/iudico
            private bool SequencingRuleCheck(Activity activity, SequencingRuleNodeReader rule) // [UP.2.1] (for an activity and a Sequencing Rule; returns True if the rule applies, False if the rule does not apply, and Unknown if the condition(s) cannot be evaluated):
            {
                bool? bRet = null;
                bool firstRule = true;

                // Evaluate each condition against the activity's tracking information
                foreach(SequencingRuleConditionNodeReader condition in rule.Conditions)
                {
                    bool? b = null;
                    bool objectiveMeasureStatus;
                    float objectiveNormalizedMeasure;
                    bool progressStatus;
                    bool satisfiedStatus;

                    switch(condition.Condition)
                    {
                    case SequencingRuleCondition.Always:
                        b = true;
                        break;
                    case SequencingRuleCondition.Satisfied:
                        GetObjectiveSatisfiedStatus(activity, condition.ReferencedObjectiveId, out progressStatus, out satisfiedStatus);
                        if(progressStatus)
                        {
                            b = satisfiedStatus;
                        }
                        break;
                    case SequencingRuleCondition.ObjectiveStatusKnown:
                        GetObjectiveSatisfiedStatus(activity, condition.ReferencedObjectiveId, out progressStatus, out satisfiedStatus);
                        b = progressStatus;
                        break;
                    case SequencingRuleCondition.ObjectiveMeasureKnown:
                        GetObjectiveNormalizedMeasure(activity, condition.ReferencedObjectiveId, out objectiveMeasureStatus, out objectiveNormalizedMeasure);
                        b = objectiveMeasureStatus;
                        break;
                    case SequencingRuleCondition.ObjectiveMeasureGreaterThan:
                        GetObjectiveNormalizedMeasure(activity, condition.ReferencedObjectiveId, out objectiveMeasureStatus, out objectiveNormalizedMeasure);
                        if(objectiveMeasureStatus)
                        {
                            b = (objectiveNormalizedMeasure > (float)condition.MeasureThreshold);
                        }
                        break;
                    case SequencingRuleCondition.ObjectiveMeasureLessThan:
                        GetObjectiveNormalizedMeasure(activity, condition.ReferencedObjectiveId, out objectiveMeasureStatus, out objectiveNormalizedMeasure);
                        if(objectiveMeasureStatus)
                        {
                            b = (objectiveNormalizedMeasure < (float)condition.MeasureThreshold);
                        }
                        break;
                    case SequencingRuleCondition.Completed:
                        if(activity.DataModel.AttemptProgressStatus)
                        {
                            b = activity.DataModel.AttemptCompletionStatus;
                        }
                        break;
                    case SequencingRuleCondition.ActivityProgressKnown:
                        b = activity.DataModel.ActivityProgressStatus & activity.DataModel.AttemptProgressStatus;
                        break;
                    case SequencingRuleCondition.Attempted:
                        //if(activity.DataModel.ActivityProgressStatus)
                        //{
                            b = (activity.DataModel.ActivityAttemptCount > 0);
                        //}
                        break;
                    case SequencingRuleCondition.AttemptLimitExceeded:
                        //if(activity.DataModel.ActivityProgressStatus)
                        //{
                            b = (activity.DataModel.ActivityAttemptCount >= activity.Sequencing.AttemptLimit);
                        //}
                        break;
                    case SequencingRuleCondition.OutsideAvailableTimeRange:
                        // not supported
                        b = false;
                        break;
                    case SequencingRuleCondition.TimeLimitExceeded:
                        // not supported
                        b = false;
                        break;
                    default:
                        Utilities.Assert(false);
                        b = false;
                        break;
                    }
                    if(condition.Operator == SequencingConditionOperator.Not && b.HasValue)
                    {
                        b = !b;
                    }
                    if(rule.Combination == SequencingConditionCombination.All)
                    {
                        if(firstRule)
                        {
                            firstRule = false;
                            bRet = b;
                        }
                        else
                        {
                            // perform AND as per truth table on page SN-4-36
                            switch(b)
                            {
                            case true:
                                // any value AND with true results in that same value
                                break;
                            case false:
                                // any value AND with false results in false
                                bRet = false;
                                break;
                            case null:
                                // true or unknown AND with unknown results in unknown
                                // false AND with unknown results in false
                                if(bRet != false)
                                {
                                    bRet = null;
                                }
                                break;
                            }
                        }
                    }
                    else
                    {
                        if(firstRule)
                        {
                            firstRule = false;
                            bRet = b;
                        }
                        else
                        {
                            // perform OR as per truth table on page SN-4-36
                            switch(b)
                            {
                            case true:
                                // any value OR with true results in true
                                bRet = true;
                                break;
                            case false:
                                // any value OR with false results that same value
                                break;
                            case null:
                                // false or unknown OR with unknown results in unknown
                                // true OR with unknown results in true
                                if(bRet != true)
                                {
                                    bRet = null;
                                }
                                break;
                            }
                        }
                    }
                }
                return (bRet == true);
            }