public void Returns_binary_tree_object_when_input_data_is_valid()
        {
            //Arrange
            const string inputDir      = @"c:\root\in";
            const string inputFileName = "myfile.txt";
            var          inputFilePath = Path.Combine(inputDir, inputFileName);

            var textLfileLines = new StringBuilder();

            textLfileLines.AppendLine("1");
            textLfileLines.AppendLine("8 9");
            textLfileLines.AppendLine("1 5 9");
            textLfileLines.AppendLine("4 5 2 3");

            var mockInputFile = new MockFileData(textLfileLines.ToString());

            var mockFileSystem = new MockFileSystem();

            mockFileSystem.AddFile(inputFilePath, mockInputFile);

            var sut = new BinaryTreeReader(mockFileSystem);

            //Act
            var actualResult = sut.GetBinaryTree(inputFilePath);

            //Assert
            actualResult.IsSuccess.Should().BeTrue();
            actualResult.IsFailure.Should().BeFalse();
            actualResult.Value.GetType().Should().Be(typeof(BinaryTree));
        }
        public void Returns_error_when_line_has_same_number_of_values_comparing_to_previous_line()
        {
            //Arrange
            const string inputDir      = @"c:\root\in";
            const string inputFileName = "myfile.txt";
            var          inputFilePath = Path.Combine(inputDir, inputFileName);

            var textLfileLines = new StringBuilder();

            textLfileLines.AppendLine("1");
            textLfileLines.AppendLine("8 9");
            textLfileLines.AppendLine("1 5 9");
            textLfileLines.AppendLine("4 5 2");

            var mockInputFile = new MockFileData(textLfileLines.ToString());

            var mockFileSystem = new MockFileSystem();

            mockFileSystem.AddFile(inputFilePath, mockInputFile);

            var sut = new BinaryTreeReader(mockFileSystem);

            //Act
            var actualResult = sut.GetBinaryTree(inputFilePath);

            //Assert
            actualResult.IsFailure.Should().BeTrue();
            actualResult.IsSuccess.Should().BeFalse();
            actualResult.Error.Should().Be("Invalid binary tree data structure.");
        }
        public void Returns_correct_max_sum_of_odd_event_sequential_nodes_path_3()
        {
            //Arrange
            const string inputDir      = @"c:\root\in";
            const string inputFileName = "myfile.txt";
            var          inputFilePath = Path.Combine(inputDir, inputFileName);

            var textLfileLines = new StringBuilder();

            textLfileLines.AppendLine("1");
            textLfileLines.AppendLine("8 8");
            textLfileLines.AppendLine("1 5 9");
            textLfileLines.AppendLine("4 5 2 2");

            var mockInputFile = new MockFileData(textLfileLines.ToString());

            var mockFileSystem = new MockFileSystem();

            mockFileSystem.AddFile(inputFilePath, mockInputFile);

            var binaryTreeReader = new BinaryTreeReader(mockFileSystem);
            var sut = binaryTreeReader.GetBinaryTree(inputFilePath).Value;

            //Act
            var actualResult = sut.GetMaxSumOfOddEventSequentialNodes();


            //Assert
            actualResult.IsSuccess.Should().BeTrue();
            actualResult.IsFailure.Should().BeFalse();
            actualResult.Value.Should().Be(20);
        }
        public void Returns_error_then_no_valid_path_exist()
        {
            //Arrange
            const string inputDir      = @"c:\root\in";
            const string inputFileName = "myfile.txt";
            var          inputFilePath = Path.Combine(inputDir, inputFileName);

            var textLfileLines = new StringBuilder();

            textLfileLines.AppendLine("1");
            textLfileLines.AppendLine("8 9");
            textLfileLines.AppendLine("2 2 9");
            textLfileLines.AppendLine("4 5 2 3");

            var mockInputFile = new MockFileData(textLfileLines.ToString());

            var mockFileSystem = new MockFileSystem();

            mockFileSystem.AddFile(inputFilePath, mockInputFile);

            var binaryTreeReader = new BinaryTreeReader(mockFileSystem);
            var sut = binaryTreeReader.GetBinaryTree(inputFilePath).Value;

            //Act
            var actualResult = sut.GetMaxSumOfOddEventSequentialNodes();


            //Assert
            actualResult.IsSuccess.Should().BeFalse();
            actualResult.IsFailure.Should().BeTrue();
            actualResult.Error.Should().Be("Binary tree does not contain valid path.");
        }
示例#5
0
 public static FileSystem ReadBsoa(System.IO.Stream stream)
 {
     using (BinaryTreeReader reader = new BinaryTreeReader(stream))
     {
         FileSystem result = new FileSystem();
         result.DB.Read(reader);
         return(result);
     }
 }
示例#6
0
文件: Run.cs 项目: MShaffar19/bion
 public static Run ReadBsoa(System.IO.Stream stream)
 {
     using (BinaryTreeReader reader = new BinaryTreeReader(stream))
     {
         Run result = new Run();
         result.DB.Read(reader);
         return(result);
     }
 }
示例#7
0
 public static Company ReadBsoa(System.IO.Stream stream)
 {
     using (BinaryTreeReader reader = new BinaryTreeReader(stream))
     {
         Company result = new Company();
         result.DB.Read(reader);
         return(result);
     }
 }
示例#8
0
 public static TreeDiagnostics Diagnostics(System.IO.Stream stream)
 {
     using (BinaryTreeReader btr = new BinaryTreeReader(stream))
         using (TreeDiagnosticsReader reader = new TreeDiagnosticsReader(btr))
         {
             FileSystem result = new FileSystem();
             result.DB.Read(reader);
             return(reader.Tree);
         }
 }
        public void Returns_error_then_file_does_not_exist()
        {
            //Arrange
            var sut = new BinaryTreeReader();

            //Act
            var actualResult = sut.GetBinaryTree("nonexistingfile.txt");

            //Assert
            actualResult.IsFailure.Should().BeTrue();
            actualResult.IsSuccess.Should().BeFalse();
            actualResult.Error.Should().StartWith("Could not find file");
        }
示例#10
0
        public void Returns_correct_max_sum_of_odd_event_sequential_nodes_when_reads_real_file()
        {
            //Arrange
            var binaryTreeReader = new BinaryTreeReader();
            var sut = binaryTreeReader.GetBinaryTree("testdata2.txt").Value;

            //Act
            var actualResult = sut.GetMaxSumOfOddEventSequentialNodes();

            //Assert
            actualResult.IsSuccess.Should().BeTrue();
            actualResult.IsFailure.Should().BeFalse();
            actualResult.Value.Should().Be(16);
        }
        public bool Read(string path)
        {
            if (!File.Exists(path))
            {
                return(false);
            }

            try
            {
                using (BinaryTreeReader reader = new BinaryTreeReader(path))
                {
                    // get root node
                    BinaryReader node = reader.GetRootNode();
                    if (node == null)
                    {
                        return(false);
                    }

                    node.ReadByte();   // first byte of otb is 0
                    node.ReadUInt32(); // 4 bytes flags, unused

                    byte attr = node.ReadByte();
                    if ((RootAttribute)attr == RootAttribute.Version)
                    {
                        ushort datalen = node.ReadUInt16();
                        if (datalen != 140) // 4 + 4 + 4 + 1 * 128
                        {
                            Trace.WriteLine(String.Format("Size of version header is invalid, updated .otb version?"));
                            return(false);
                        }

                        this.Items.MajorVersion = node.ReadUInt32(); // major, file version
                        this.Items.MinorVersion = node.ReadUInt32(); // minor, client version
                        this.Items.BuildNumber  = node.ReadUInt32(); // build number, revision
                        node.BaseStream.Seek(128, SeekOrigin.Current);
                    }

                    node = reader.GetChildNode();
                    if (node == null)
                    {
                        return(false);
                    }

                    do
                    {
                        ServerItem item = new ServerItem();

                        ServerItemGroup itemGroup = (ServerItemGroup)node.ReadByte();
                        switch (itemGroup)
                        {
                        case ServerItemGroup.None:
                            item.Type = ServerItemType.None;
                            break;

                        case ServerItemGroup.Ground:
                            item.Type = ServerItemType.Ground;
                            break;

                        case ServerItemGroup.Container:
                            item.Type = ServerItemType.Container;
                            break;

                        case ServerItemGroup.Splash:
                            item.Type = ServerItemType.Splash;
                            break;

                        case ServerItemGroup.Fluid:
                            item.Type = ServerItemType.Fluid;
                            break;

                        case ServerItemGroup.Deprecated:
                            item.Type = ServerItemType.Deprecated;
                            break;
                        }

                        ServerItemFlag flags = (ServerItemFlag)node.ReadUInt32();

                        item.Unpassable        = ((flags & ServerItemFlag.Unpassable) == ServerItemFlag.Unpassable);
                        item.BlockMissiles     = ((flags & ServerItemFlag.BlockMissiles) == ServerItemFlag.BlockMissiles);
                        item.BlockPathfinder   = ((flags & ServerItemFlag.BlockPathfinder) == ServerItemFlag.BlockPathfinder);
                        item.HasElevation      = ((flags & ServerItemFlag.HasElevation) == ServerItemFlag.HasElevation);
                        item.ForceUse          = ((flags & ServerItemFlag.ForceUse) == ServerItemFlag.ForceUse);
                        item.MultiUse          = ((flags & ServerItemFlag.MultiUse) == ServerItemFlag.MultiUse);
                        item.Pickupable        = ((flags & ServerItemFlag.Pickupable) == ServerItemFlag.Pickupable);
                        item.Movable           = ((flags & ServerItemFlag.Movable) == ServerItemFlag.Movable);
                        item.Stackable         = ((flags & ServerItemFlag.Stackable) == ServerItemFlag.Stackable);
                        item.HasStackOrder     = ((flags & ServerItemFlag.StackOrder) == ServerItemFlag.StackOrder);
                        item.Readable          = ((flags & ServerItemFlag.Readable) == ServerItemFlag.Readable);
                        item.Rotatable         = ((flags & ServerItemFlag.Rotatable) == ServerItemFlag.Rotatable);
                        item.Hangable          = ((flags & ServerItemFlag.Hangable) == ServerItemFlag.Hangable);
                        item.HookSouth         = ((flags & ServerItemFlag.HookSouth) == ServerItemFlag.HookSouth);
                        item.HookEast          = ((flags & ServerItemFlag.HookEast) == ServerItemFlag.HookEast);
                        item.AllowDistanceRead = ((flags & ServerItemFlag.AllowDistanceRead) == ServerItemFlag.AllowDistanceRead);
                        item.HasCharges        = ((flags & ServerItemFlag.ClientCharges) == ServerItemFlag.ClientCharges);
                        item.IgnoreLook        = ((flags & ServerItemFlag.IgnoreLook) == ServerItemFlag.IgnoreLook);
                        item.FullGround        = ((flags & ServerItemFlag.FullGround) == ServerItemFlag.FullGround);
                        item.IsAnimation       = ((flags & ServerItemFlag.IsAnimation) == ServerItemFlag.IsAnimation);

                        while (node.PeekChar() != -1)
                        {
                            ServerItemAttribute attribute = (ServerItemAttribute)node.ReadByte();
                            ushort datalen = node.ReadUInt16();

                            switch (attribute)
                            {
                            case ServerItemAttribute.ServerID:
                                item.ID = node.ReadUInt16();
                                break;

                            case ServerItemAttribute.ClientID:
                                item.ClientId = node.ReadUInt16();
                                break;

                            case ServerItemAttribute.GroundSpeed:
                                item.GroundSpeed = node.ReadUInt16();
                                break;

                            case ServerItemAttribute.PriceCount:
                                item.PriceCount = node.ReadUInt32();
                                break;

                            case ServerItemAttribute.Name:
                                byte[] buffer = node.ReadBytes(datalen);
                                item.Name = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                                break;

                            case ServerItemAttribute.SpriteHash:
                                item.SpriteHash = node.ReadBytes(datalen);
                                break;

                            case ServerItemAttribute.MinimaColor:
                                item.MinimapColor = node.ReadUInt16();
                                break;

                            case ServerItemAttribute.MaxReadWriteChars:
                                item.MaxReadWriteChars = node.ReadUInt16();
                                break;

                            case ServerItemAttribute.MaxReadChars:
                                item.MaxReadChars = node.ReadUInt16();
                                break;

                            case ServerItemAttribute.Light:
                                item.LightLevel = node.ReadUInt16();
                                item.LightColor = node.ReadUInt16();
                                break;

                            case ServerItemAttribute.StackOrder:
                                item.StackOrder = (TileStackOrder)node.ReadByte();
                                break;

                            case ServerItemAttribute.TradeAs:
                                item.TradeAs = node.ReadUInt16();
                                break;

                            default:
                                node.BaseStream.Seek(datalen, SeekOrigin.Current);
                                break;
                            }
                        }

                        if (item.SpriteHash == null && item.Type != ServerItemType.Deprecated)
                        {
                            item.SpriteHash = new byte[16];
                        }

                        this.Items.Add(item);
                        node = reader.GetNextNode();
                    }while (node != null);
                }
            }
            catch
            {
                return(false);
            }

            return(true);
        }