/// <summary>
 /// Get work hours for the given time block.
 /// </summary>
 /// <param name="timePeriod">The time block according to which the calculations are to be performed.</param>
 /// <returns></returns>
 public int Goal(ITimeBlock timePeriod)
 {
     // Holidays API
     // 1000 Non commercial use only Attribution Required
     // https://calendarific.com/account
     throw new NotImplementedException();
 }
示例#2
0
        public void CopyTest()
        {
            TimeBlock readOnlyTimeBlock = new TimeBlock(_start, _duration);

            Assert.AreEqual(readOnlyTimeBlock.Copy(TimeSpan.Zero), readOnlyTimeBlock);

            TimeBlock timeBlock = new TimeBlock(_start, _duration);

            Assert.AreEqual(timeBlock.Start, _start);
            Assert.AreEqual(timeBlock.End, _end);
            Assert.AreEqual(timeBlock.Duration, _duration);

            ITimeBlock noMoveTimeBlock = timeBlock.Copy(TimeSpan.Zero);

            Assert.AreEqual(noMoveTimeBlock.Start, _start);
            Assert.AreEqual(noMoveTimeBlock.End, _end);
            Assert.AreEqual(noMoveTimeBlock.Duration, _duration);

            TimeSpan   forwardOffset    = new TimeSpan(2, 30, 15);
            ITimeBlock forwardTimeBlock = timeBlock.Copy(forwardOffset);

            Assert.AreEqual(forwardTimeBlock.Start, _start.Add(forwardOffset));
            Assert.AreEqual(forwardTimeBlock.End, _end.Add(forwardOffset));
            Assert.AreEqual(forwardTimeBlock.Duration, _duration);

            TimeSpan   backwardOffset    = new TimeSpan(-1, 10, 30);
            ITimeBlock backwardTimeBlock = timeBlock.Copy(backwardOffset);

            Assert.AreEqual(backwardTimeBlock.Start, _start.Add(backwardOffset));
            Assert.AreEqual(backwardTimeBlock.End, _end.Add(backwardOffset));
            Assert.AreEqual(backwardTimeBlock.Duration, _duration);
        }
示例#3
0
        public void CopyTest()
        {
            TimeBlock readOnlyTimeBlock = new TimeBlock(start, duration);

            Assert.Equal(readOnlyTimeBlock.Copy(TimeSpan.Zero), readOnlyTimeBlock);

            TimeBlock timeBlock = new TimeBlock(start, duration);

            Assert.Equal <DateTime>(timeBlock.Start, start);
            Assert.Equal <DateTime>(timeBlock.End, end);
            Assert.Equal <TimeSpan>(timeBlock.Duration, duration);

            ITimeBlock noMoveTimeBlock = timeBlock.Copy(TimeSpan.Zero);

            Assert.Equal <DateTime>(noMoveTimeBlock.Start, start);
            Assert.Equal <DateTime>(noMoveTimeBlock.End, end);
            Assert.Equal <TimeSpan>(noMoveTimeBlock.Duration, duration);

            TimeSpan   forwardOffset    = new TimeSpan(2, 30, 15);
            ITimeBlock forwardTimeBlock = timeBlock.Copy(forwardOffset);

            Assert.Equal <DateTime>(forwardTimeBlock.Start, start.Add(forwardOffset));
            Assert.Equal <DateTime>(forwardTimeBlock.End, end.Add(forwardOffset));
            Assert.Equal <TimeSpan>(forwardTimeBlock.Duration, duration);

            TimeSpan   backwardOffset    = new TimeSpan(-1, 10, 30);
            ITimeBlock backwardTimeBlock = timeBlock.Copy(backwardOffset);

            Assert.Equal <DateTime>(backwardTimeBlock.Start, start.Add(backwardOffset));
            Assert.Equal <DateTime>(backwardTimeBlock.End, end.Add(backwardOffset));
            Assert.Equal <TimeSpan>(backwardTimeBlock.Duration, duration);
        }         // CopyTest
示例#4
0
        public void GetNextPeriodTest()
        {
            TimeBlock readOnlyTimeBlock = new TimeBlock(start, duration, true);

            Assert.True(readOnlyTimeBlock.GetNextPeriod().IsReadOnly);

            TimeBlock timeBlock = new TimeBlock(start, duration);

            Assert.Equal(timeBlock.Start, start);
            Assert.Equal(timeBlock.End, end);
            Assert.Equal(timeBlock.Duration, duration);

            ITimeBlock nextTimeBlock = timeBlock.GetNextPeriod();

            Assert.Equal(nextTimeBlock.Start, end);
            Assert.Equal(nextTimeBlock.End, end.Add(duration));
            Assert.Equal(nextTimeBlock.Duration, duration);

            TimeSpan   nextOffset          = Duration.Hour;
            ITimeBlock nextOffsetTimeBlock = timeBlock.GetNextPeriod(nextOffset);

            Assert.Equal(nextOffsetTimeBlock.Start, end.Add(nextOffset));
            Assert.Equal(nextOffsetTimeBlock.End, end.Add(duration + nextOffset));
            Assert.Equal(nextOffsetTimeBlock.Duration, duration);
        }         // GetNextPeriodTest
示例#5
0
        public void GetPreviousPeriodTest()
        {
            TimeBlock readOnlyTimeBlock = new TimeBlock(start, duration, true);

            Assert.True(readOnlyTimeBlock.GetPreviousPeriod().IsReadOnly);

            TimeBlock timeBlock = new TimeBlock(start, duration);

            Assert.Equal(timeBlock.Start, start);
            Assert.Equal(timeBlock.End, end);
            Assert.Equal(timeBlock.Duration, duration);

            ITimeBlock previousTimeBlock = timeBlock.GetPreviousPeriod();

            Assert.Equal(previousTimeBlock.Start, start.Subtract(duration));
            Assert.Equal(previousTimeBlock.End, start);
            Assert.Equal(previousTimeBlock.Duration, duration);

            TimeSpan   previousOffset          = Duration.Hour.Negate();
            ITimeBlock previousOffsetTimeBlock = timeBlock.GetPreviousPeriod(previousOffset);

            Assert.Equal(previousOffsetTimeBlock.Start, start.Subtract(duration).Add(previousOffset));
            Assert.Equal(previousOffsetTimeBlock.End, end.Subtract(duration).Add(previousOffset));
            Assert.Equal(previousOffsetTimeBlock.Duration, duration);
        }         // GetPreviousPeriodTest
示例#6
0
        public void GetNextPeriodTest()
        {
            TimeBlock readOnlyTimeBlock = new TimeBlock(_start, _duration, true);

            Assert.IsTrue(readOnlyTimeBlock.GetNextBlock().IsReadOnly);

            TimeBlock timeBlock = new TimeBlock(_start, _duration);

            Assert.AreEqual(timeBlock.Start, _start);
            Assert.AreEqual(timeBlock.End, _end);
            Assert.AreEqual(timeBlock.Duration, _duration);

            ITimeBlock nextTimeBlock = timeBlock.GetNextBlock();

            Assert.AreEqual(nextTimeBlock.Start, _end);
            Assert.AreEqual(nextTimeBlock.End, _end.Add(_duration));
            Assert.AreEqual(nextTimeBlock.Duration, _duration);

            TimeSpan   nextOffset          = TimeSpan.FromHours(1);
            ITimeBlock nextOffsetTimeBlock = timeBlock.GetNextBlock(nextOffset);

            Assert.AreEqual(nextOffsetTimeBlock.Start, _end.Add(nextOffset));
            Assert.AreEqual(nextOffsetTimeBlock.End, _end.Add(_duration + nextOffset));
            Assert.AreEqual(nextOffsetTimeBlock.Duration, _duration);
        }
示例#7
0
        public void GetIntersectionTest()
        {
            TimeBlock readOnlyTimeBlock = new TimeBlock(start, duration);

            Assert.Equal(readOnlyTimeBlock.GetIntersection(readOnlyTimeBlock), new TimeBlock(readOnlyTimeBlock));

            TimeBlock timeBlock = new TimeBlock(start, duration);

            // before
            ITimeBlock before1 = timeBlock.GetIntersection(new TimeBlock(start.AddHours(-2), start.AddHours(-1)));

            Assert.Null(before1);
            ITimeBlock before2 = timeBlock.GetIntersection(new TimeBlock(start.AddMilliseconds(-1), start));

            Assert.Equal(before2, new TimeBlock(start));
            ITimeBlock before3 = timeBlock.GetIntersection(new TimeBlock(start.AddMilliseconds(-1), start.AddMilliseconds(1)));

            Assert.Equal(before3, new TimeBlock(start, start.AddMilliseconds(1)));

            // after
            ITimeBlock after1 = timeBlock.GetIntersection(new TimeBlock(end.AddHours(1), end.AddHours(2)));

            Assert.Null(after1);
            ITimeBlock after2 = timeBlock.GetIntersection(new TimeBlock(end, end.AddMilliseconds(1)));

            Assert.Equal(after2, new TimeBlock(end));
            ITimeBlock after3 = timeBlock.GetIntersection(new TimeBlock(end.AddMilliseconds(-1), end.AddMilliseconds(1)));

            Assert.Equal(after3, new TimeBlock(end.AddMilliseconds(-1), end));

            // intersect
            Assert.Equal(timeBlock.GetIntersection(timeBlock), timeBlock);
            ITimeBlock itersect1 = timeBlock.GetIntersection(new TimeBlock(start.AddMilliseconds(-1), end.AddMilliseconds(1)));

            Assert.Equal(itersect1, timeBlock);
            ITimeBlock itersect2 = timeBlock.GetIntersection(new TimeBlock(start.AddMilliseconds(1), end.AddMilliseconds(-1)));

            Assert.Equal(itersect2, new TimeBlock(start.AddMilliseconds(1), end.AddMilliseconds(-1)));
        }         // GetIntersectionTest
示例#8
0
        public void GetIntersectionTest()
        {
            TimeBlock readOnlyTimeBlock = new TimeBlock(_start, _duration);

            Assert.AreEqual(readOnlyTimeBlock.GetIntersectionBlock(readOnlyTimeBlock), new TimeBlock(readOnlyTimeBlock));

            TimeBlock timeBlock = new TimeBlock(_start, _duration);

            // before
            ITimeBlock before1 = timeBlock.GetIntersectionBlock(new TimeBlock(_start.AddHours(-2), _start.AddHours(-1)));

            Assert.AreEqual(before1, null);
            ITimeBlock before2 = timeBlock.GetIntersectionBlock(new TimeBlock(_start.AddMilliseconds(-1), _start));

            Assert.AreEqual(before2, new TimeBlock(_start));
            ITimeBlock before3 = timeBlock.GetIntersectionBlock(new TimeBlock(_start.AddMilliseconds(-1), _start.AddMilliseconds(1)));

            Assert.AreEqual(before3, new TimeBlock(_start, _start.AddMilliseconds(1)));

            // after
            ITimeBlock after1 = timeBlock.GetIntersectionBlock(new TimeBlock(_end.AddHours(1), _end.AddHours(2)));

            Assert.AreEqual(after1, null);
            ITimeBlock after2 = timeBlock.GetIntersectionBlock(new TimeBlock(_end, _end.AddMilliseconds(1)));

            Assert.AreEqual(after2, new TimeBlock(_end));
            ITimeBlock after3 = timeBlock.GetIntersectionBlock(new TimeBlock(_end.AddMilliseconds(-1), _end.AddMilliseconds(1)));

            Assert.AreEqual(after3, new TimeBlock(_end.AddMilliseconds(-1), _end));

            // intersect
            Assert.AreEqual(timeBlock.GetIntersectionBlock(timeBlock), timeBlock);
            ITimeBlock itersect1 = timeBlock.GetIntersectionBlock(new TimeBlock(_start.AddMilliseconds(-1), _end.AddMilliseconds(1)));

            Assert.AreEqual(itersect1, timeBlock);
            ITimeBlock itersect2 = timeBlock.GetIntersectionBlock(new TimeBlock(_start.AddMilliseconds(1), _end.AddMilliseconds(-1)));

            Assert.AreEqual(itersect2, new TimeBlock(_start.AddMilliseconds(1), _end.AddMilliseconds(-1)));
        }
 public static TimePeriod[] MakeArray(ITimeBlock[] list, int quantum)
 {
     if (list != null && list.Length > 0)
     {
         List<TimePeriod> tbList = new List<TimePeriod>();
         foreach (ITimeBlock tb in list)
         {
             tbList.Add(new TimePeriod(tb.Start, tb.Duration,quantum));
         }
         return tbList.ToArray();
     }
     else return null;
 }
 public int Split(ITimeBlock subBlock, ref TimeBlock intersection, ref TimeBlock previous, ref TimeBlock remaining)
 {
     int status = 0;
     intersection = null;
     previous = null;
     remaining = null;
     if (Intersects(subBlock))
     {
         intersection = Intersection(subBlock);
         if (startTime < intersection.Start)
         {
             previous = new TimeBlock(startTime, intersection.Start);
             status |= 1;
         }
         else if (intersection.Start > subBlock.Start)
         {
             previous = new TimeBlock(subBlock.Start, intersection.Start);
             status |= 2;
         }
         if (End > intersection.End)
         {
             remaining = new TimeBlock(intersection.End, End);
             status |= 4;
         }
         else if (subBlock.End > intersection.End)
         {
             remaining = new TimeBlock(intersection.End, subBlock.End);
             status |= 8;
         }
     }
     return status;
 }
 public bool Contains(ITimeBlock target)
 {
     return ((this.startTime <= target.Start) && (this.End >= target.End));
 }
示例#12
0
 public TimeBlock Intersection(ITimeBlock target)
 {
     if (Intersects(target))
     {
         DateTime start = (Start > target.Start) ? Start : target.Start;
         DateTime end = (End < target.End) ? End : target.End;
         return new TimeBlock(start, end);
     }
     else
         return null;
 }
示例#13
0
        private int renderScheduledTime(HtmlTextWriter output,  ITimeBlock tb)
        {
            output.WriteLine();
            output.RenderBeginTag("tr");
               int height = Convert.ToInt32((((hourHeight * tb.Duration)/3600.0)));
               //output.AddAttribute("onclick", "javascript:" + Page.ClientScript.GetPostBackEventReference(this, startTime.ToString("s")));

               output.AddStyleAttribute("background-color", ColorTranslator.ToHtml(scheduledColor));
            output.AddStyleAttribute("cursor", "hand");
            output.AddStyleAttribute("border-bottom", "1px solid " + ColorTranslator.ToHtml(BorderColor));
            output.AddStyleAttribute("height", height + "px");
            output.AddAttribute("title", tb.Start.AddMinutes(userTZ).TimeOfDay.ToString() + " - " + tb.End.AddMinutes(userTZ).TimeOfDay.ToString());
            output.RenderBeginTag("td");
            //if(height > 24)
            //    output.Write(tb.Start.AddMinutes(userTZ).TimeOfDay );
            //if(height > 48)
            //    output.Write(" - " + tb.End.AddMinutes(userTZ).TimeOfDay);
            output.RenderEndTag();
            output.RenderEndTag();
            return height;
        }
 public static bool HasUnion(ITimeBlock a, ITimeBlock b)
 {
     return (a.Start <= b.End && a.End >= b.Start);
 }
        public static TimeBlock[] Concatenate(ITimeBlock[] listIn)
        {
            if (listIn != null && listIn.Length > 0)
            {
                TimeBlock[] list = TimeBlock.MakeArray(listIn);

                TimeBlock wrk = null;
                bool cont = true;
                while (cont)
                {
                    cont = false;
                    bool[] status = new bool[list.Length];
                    List<TimeBlock> returnList = new List<TimeBlock>();
                    for (int i = 0; i < list.Length; i++)
                    {
                        if (!status[i])
                        {
                            status[i] = true;
                            wrk = list[i];
                            for (int j = i + 1; j < list.Length; j++)
                            {
                                if (!status[j])
                                {
                                    if (TimeBlock.HasUnion(wrk, list[j]))
                                    {
                                        wrk = TimeBlock.Union(wrk,list[j]);
                                        status[j] = true;
                                        cont = true;
                                    }
                                }
                            }
                            returnList.Add(wrk);
                        }
                    }
                    list = returnList.ToArray();
                }
                return list;
            }
            else return null;
        }
        public static TimeBlock[] Remaining(ITimeBlock[] range, ITimeBlock[] remove)
        {
            List<TimeBlock> rangeList = null;
            List<TimeBlock> removeBlocks = new List<TimeBlock>();
            List<TimeBlock> removeList = new List<TimeBlock>();
            List<TimeBlock> addList = new List<TimeBlock>();
            int minTime = 0;
            if (range != null && range.Length > 0)
            {
                rangeList = new List<TimeBlock>();
                rangeList.AddRange(TimeBlock.Concatenate(range));
                if (remove != null && remove.Length > 0)
                {
                    removeList.AddRange(TimeBlock.MakeArray(remove));
                    TimeBlock tmp;
                    int code = 0;
                    int hit = 0;
                    TimeBlock intersection = null;
                    TimeBlock previous = null;
                    TimeBlock remainder = null;

                    foreach (TimeBlock remTB in removeList)
                    {

                        foreach (TimeBlock rangeTB in rangeList)
                        {
                            intersection = null;
                            previous = null;
                            remainder = null;
                            if (rangeTB.Intersects(remTB))
                            {

                                code = rangeTB.Split(remTB, ref intersection, ref previous, ref remainder);
                                if (previous != null)
                                {
                                    addList.Add(previous);
                                }
                                if (remainder != null)
                                {
                                    addList.Add(remainder);
                                }
                            }
                            else
                            {
                                addList.Add(rangeTB);
                            }
                        }
                        rangeList.Clear();
                        rangeList.AddRange(addList);
                        addList.Clear();
                    }
                }
            }
            if (rangeList != null)
            {
                return rangeList.ToArray();
            }
            else return null;
        }
        public static TimeBlock[] Remaining_1(ITimeBlock[] range, ITimeBlock[] remove)
        {
            List<TimeBlock> rangeList = null;
            int minTime = 0;
            if (range != null && range.Length > 0)
            {
                rangeList = new List<TimeBlock>();
                rangeList.AddRange(TimeBlock.MakeArray(range));
                if (remove != null && remove.Length > 0)
                {

                    List<TimeBlock> removeList = new List<TimeBlock>();
                    removeList.AddRange(TimeBlock.MakeArray(remove));
                    TimeBlock tmp;
                    int code = 0;
                    int hit = 0;
                    List<TimeBlock> addBlocks = new List<TimeBlock>();
                    List<TimeBlock> removeBlocks = new List<TimeBlock>();
                    foreach (TimeBlock remTB in removeList)
                    {
                        if (removeBlocks.Count > 0)
                        {
                            foreach (TimeBlock rt in removeBlocks)
                            {
                                rangeList.Remove(rt);
                            }
                            removeBlocks.Clear();
                        }
                        if (addBlocks.Count > 0)
                        {
                            rangeList.AddRange(addBlocks);
                            addBlocks.Clear();
                        }
                        TimeBlock intersection = null;
                        TimeBlock previous = null;
                        TimeBlock remainder = null;
                        foreach (TimeBlock tb in rangeList)
                        {
                            if (tb.duration > minTime)
                            {
                                if (remTB.Intersects(tb))
                                {
                                    removeBlocks.Add(tb);
                                    code = tb.Split(remTB, ref intersection, ref previous, ref remainder);
                                    if ((code & 1) == 1)
                                    {
                                        if (previous.duration >= minTime)
                                        {
                                            addBlocks.Add(previous);
                                        }
                                    }
                                    if ((code & 4) == 4)
                                    {
                                        if (remainder.duration >= minTime)
                                        {
                                            addBlocks.Add(remainder);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                removeBlocks.Add(tb);
                            }
                        }
                    }
                }

            }
            if (rangeList != null)
            {
                return rangeList.ToArray();
            }
            else return null;
        }
示例#18
0
 public int CompareTo(ITimeBlock b)
 {
     int status = 0;
     if (Start > b.Start)
     {
         status = 1;
     }
     else if (Start < b.Start)
     {
         status = -1;
     }
     else if (Duration > b.Duration)
     {
         status = 1;
     }
     else if (Duration < b.Duration)
     {
         status = -1;
     }
     return status;
 }
 public static TimeBlock Union(ITimeBlock a, ITimeBlock b)
 {
     TimeBlock tb = null;
     if(TimeBlock.HasUnion(a,b))
         tb = new TimeBlock(a.Start <= b.Start ? a.Start : b.Start,a.End >= b.End ?a.End:b.End);
     return tb;
 }
示例#20
0
 public bool Intersects(ITimeBlock target)
 {
     return (this.Start < target.End && this.End > target.Start);
 }
        private int renderScheduledTime(HtmlTextWriter output,  ITimeBlock tb)
        {
            int duration = 0;
            if (tb.End < endOfDay)
                duration = tb.Duration;
            else
                duration = new TimeBlock(tb.Start, endOfDay).Duration;
            if (duration > 0)
            {
                output.Write("<tr>");
                int height = Convert.ToInt32((((hourHeight * duration) / 3600.0)));
                //output.AddAttribute("onclick", "javascript:" + Page.ClientScript.GetPostBackEventReference(this, startTime.ToString("s")));
#if useStyle
             output.AddStyleAttribute(HtmlTextWriterStyle.Padding, zero.ToString());
            output.AddStyleAttribute(HtmlTextWriterStyle.Margin, zero.ToString());
           output.AddStyleAttribute("background-color", ColorTranslator.ToHtml(scheduledColor));
            output.AddStyleAttribute("cursor", "hand");
            //output.AddStyleAttribute("border-bottom", "1px solid " + ColorTranslator.ToHtml(BorderColor));
#endif
                output.AddAttribute("class", reservedClass);
                output.AddStyleAttribute("height", adjustHeight(height) + "px");
                if (browserMode > 0)
                {
                    output.AddStyleAttribute("border-bottom", "1px solid " + ColorTranslator.ToHtml(BorderColor));
                    output.AddStyleAttribute("background-color", ColorTranslator.ToHtml(scheduledColor));
                }
                output.AddAttribute("title", tb.Start.AddMinutes(userTZ).TimeOfDay.ToString() + " - " + tb.End.AddMinutes(userTZ).ToString());
                output.RenderBeginTag("td");
                output.RenderEndTag();
                output.WriteLine("</tr>");
            }
            return duration;
        }