Esempio n. 1
0
        public void NullTest()
        {
            var generator = new ImposedBlockGenerator();

            Assert.IsNull(generator.Next());
            generator.SetBlock(null);
            Assert.IsNull(generator.Next());
        }
Esempio n. 2
0
        public char?GetNextBlockChar(PredictionRequest predictionRequest, BlockGenerationMode mode)
        {
            string developer = GetDeveloperName(predictionRequest);

            // MaxOccurrencesOfCharacterInBlock = 1 - random block generator.
            // MaxOccurrencesOfCharacterInBlock > 1 - alternating tratments design.
            const int MaxOccurrencesOfCharacterInBlock = 2;

            using (var databaseContext = this.CreateContext())
            {
                var lastRbgData = GetLastRbgDatas(databaseContext, developer, MaxOccurrencesOfCharacterInBlock);

                int experimentDay = CalculateCurrentExperimentDay(lastRbgData);

                // Do nothing if we have RBG data for current experiment day.
                if (lastRbgData.Any() && experimentDay == lastRbgData[0].ExperimentDay)
                {
                    return(lastRbgData[0].Mode[0]);
                }

                // Calculate for new day.
                char?nextCharacterInBlock = null;

                if (mode == BlockGenerationMode.RandomBlockGenerator)
                {
                    // [0] 2018-01-05 JOHN A
                    // [1] 2018-01-04 JOHN B
                    // [2] 2018-01-03 JOHN A
                    // [3] 2018-01-02 JOHN B
                    var block = lastRbgData
                                .Select(g => g.Mode[0])
                                .Reverse()
                                .ToArray();

                    var blockGenerator = RandomBlockGenerator.Create(new[] { 'A', 'B' });
                    blockGenerator.SetBlock(block);

                    // block = { 'B', 'A', 'B', 'A' }
                    nextCharacterInBlock = blockGenerator.Next(MaxOccurrencesOfCharacterInBlock);
                }
                else if (mode == BlockGenerationMode.ImposedParticipant)
                {
                    Participant participant = GetParticipant(developer, databaseContext);

                    if (participant != null)
                    {
                        var generator = new ImposedBlockGenerator();
                        generator.SetBlock(participant.Block.ToList());
                        generator.SetPosition(experimentDay);
                        nextCharacterInBlock = generator.GetForIndex(generator.Position);
                    }
                }

                AppendRbgData(databaseContext, developer, experimentDay, nextCharacterInBlock);

                return(nextCharacterInBlock);
            }
        }
Esempio n. 3
0
        public void Test()
        {
            var generator = new ImposedBlockGenerator();

            generator.SetBlock(new List <char> {
                'A', 'B', 'C', 'D'
            });
            generator.SetPosition(-5);

            Assert.AreEqual('A', generator.Next());
            Assert.AreEqual('B', generator.Next());
            Assert.AreEqual('C', generator.Next());
            Assert.AreEqual('D', generator.Next());
            Assert.AreEqual('A', generator.Next());
            Assert.AreEqual('B', generator.Next());
            Assert.AreEqual('C', generator.Next());
            Assert.AreEqual('D', generator.Next());
            Assert.AreEqual('A', generator.Next());
            Assert.AreEqual('B', generator.Next());
            Assert.AreEqual('C', generator.Next());
            Assert.AreEqual('D', generator.Next());
        }